[py][mx]django的cookie和session操作

Posted 毛台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[py][mx]django的cookie和session操作相关的知识,希望对你有一定的参考价值。

浏览器同源策略(same-origin policy)
csrf攻击防御核心点总结

django的cookie和session操作-7天免登录
flask操作cookie&django的seesion和cookie机制

cookie操作参考: http://www.cnblogs.com/lhj588/archive/2011/10/27/2226976.html

这玩意可以实现7天免登录等功能.

session和cookie机制原理和交互过程

交互过程

① 客户端访问,无服务端写入的Cookie
② 服务端的Cookie写入浏览器
③ 浏览器解析Cookie,保存至浏览器文件
④ 客户端访问,有服务端写入的Cookie
⑤ 服务器获取

django请求中的cookie

第一次访问服务端会给一个csrf的cookie

登录完成后,默认给一个为期半个月的cookie 用于访问别的也没使用.

django中cookie与session的实现原理

app默认注册了拦截器session, 浏览器的request先过这个拦截器后,走views逻辑

之后django_session表里会维护一个记录.

django session设置

Django中操作session:

  获取session:request.session[key]     request.session.get(key)
  设置session:reqeust.session[key] = value
  删除session:del request[key]

users/views.py

def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "maotai" and password == "123456":
            request.session[\'name\'] = "maotai-session" #定义一个session key
            request.session[\'name2\'] = "maotai2-session"#定义一个session key

            name = request.session.get("name", "") # 获取一个session key
            name2 = request.session.get("name2", "")
            # return redirect("/")
            return render(request, "index.html", {"name": name, "name2": name2}) #将session key返回到前端
        else:
            return render(request, "login.html")
    elif request.method == "GET":
        return render(request, "login.html")

登录系统

可以看到设置了一个cookie字段, 可见我后端无论设置多个session key, 都给前端返回一个cookie

这里我设置了2个
            request.session[\'name\'] = "maotai-session" #定义一个session key
            request.session[\'name2\'] = "maotai2-session"#定义一个session key

点登录可以获取到key.

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<div>
    <form action="/login/" method="post">
        <p><input type="text" placeholder="username" name="username"></p>
        <p><input type="text" placeholder="password" name="password"></p>
        <p><input type="submit"></p>
        {% csrf_token %}
    </form>
</div>
</body>
</html>

django cookie默认15天过期时间设置 settings.py

cookie可以有过期时间,这样浏览器就知道什么时候可以删除cookie了。

如果cookie没有设置过期时间,当用户关闭浏览器的时候,cookie就自动过期了。

你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session框架的这一行为。

缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样,会话cookie可以在用户浏览器中保持有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周,即1,209,600 秒)。

如果你不想用户每次打开浏览器都必须重新登陆的话,用这个参数来帮你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True ,当浏览器关闭时,Django会使cookie失效。

如果SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为true的话,则每次关闭浏览器打开都得重新登录. 默认是false,即每次不必重新登录.

发现个小问题,即使每次重新登录, django_session里的session的旧记录仍然存在.

以上是关于[py][mx]django的cookie和session操作的主要内容,如果未能解决你的问题,请参考以下文章

[py][mx]django自定义认证类

[py][mx]django处理登录逻辑

[py][mx]django模板继承-课程列表页

[py][mx]django分页第三方模块django-pure-pagination

[py][mx]django通过邮箱找回密码

[py][mx]django get方法返回login页面