码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-02-01 17:36:23      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:close   put   cti   ext   控制   一个   image   bubuko   使用   

这玩意可以实现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操作

标签:close   put   cti   ext   控制   一个   image   bubuko   使用   

原文地址:https://www.cnblogs.com/iiiiiher/p/8398727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!