Django Cookie和Session

Django Cookie和Session

set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

具体参数解释

key: cookie的name
value:cookie的值
max_age:cookie存活时间,单位是秒, 默认None,只有关闭浏览器才过期, IE浏览器不支持这个参数
expires:具体过期时间 默认None,用不过期
path:cookie的访问路径,只有在某个路径下访问 如果设置根目录"/",代表根目录下所有路径都访问cookie
domain:域名,Cookie生效的域名
secure:安全,如果为True,浏览器以HTTPS来回传cookie
httpoly:如果为True那么js就不能获取cookie

cookie中的max_age和expires的关系

1. 若没有填写 max_age, expires ,默认都为None
    此时该cooike为临时的,只存在浏览器内存中, 关闭浏览器则自动删除
2. 只有max_age,  则按秒计算过期时间, 浏览器会存在本地缓存路径, 并自动删除过期cookie
3. 只有expires,  则按照时间字符串计算过期时间, 浏览器会存在本地缓存路径, 自动删除过期cookie
3. 若 max_age和 expires 同时存在,  则默认使用 max_age
4. 如果设置的cookie时间小于计算机时间, 浏览器则不提取cookie

参数填写格式
max_age = 60*60*24   #按秒计算
expires格式可以为:
	1.时间格式的字符串 : " Wdy, DD-Mth-YY HH:MM:SS GMT " 
	2.秒数
	3.datetime.datetime 对象
例:
expires = 'Thu, 28-May-2020 08:53:06 GMT'       # 24小时 格林威治时间
expires = datetime.datetime(2020, 5, 28, 23, 44, 55))
expires = 60 * 60 * 24
代码示例
response = render(request,"index_app02.html",locals())
response.set_cookie("login",True,expires=10)
return response

Session

session和cookie不同之处是,所有的cookie数据存储到服务端,然后服务端返回一个key值(session ID)对应这个存储在服务器的cookie,C端每次提交的不是cookie而是这个session ID值,

Django Session组件的工作流程:
#如果能获取到相同的session key,就不创建,只是更新session-data
if request.COOKIE.get("sessionID")
2. response.set_cookie("sessionid",dwadadawdaw)
3. 在django-session表   更新    记录
	session-key  	session-data
    dwadadawdaw		{"is_login":True,"user":"alex"}
else:
1. 生成随机字符串  dwadadawdaw
2. response.set_cookie("sessionid",dwadadawdaw)
3. 在django-session表   创建     记录
	session-key  	session-data
    dwadadawdaw		{"is_login":True,"user":"alex"}

session的更新操作

当客户端登陆了a账号,生成了随机的sessionID aa1122,那么在我们不清楚cookie前提下,再去登陆页面重新登陆b账号,随机的sessionID aa1122不会变,只是会覆盖掉之前的session-data.

Django session 获取cookie值的过程

  1. request.COOKIE.get("session") 先从cookie中获取sessionID

  2. ORM去获取这条session ID对应的value

    obj=django-session.objects.filter("sessionID").first()

​ 3. obj.session-data.get("is_login")
以上3步 都已经封装在了request.session.get(sessionID) 里面

代码示例

def session_log(request): #登陆页面,生成session
    from datetime import datetime
    if request.method == "POST":
        form_reg_data = Form_Reg(request.POST)
        user = request.POST.get("form_user")
        pwd = request.POST.get("form_pwd")
        auth_obj = models.auth.objects.filter(name=user, pwd=pwd).first()
        if auth_obj:
            #如果认证通过则设置session的键值,设置会自动写入django-session表
            request.session["user"] = user 
            request.session["is_login"] = True
            request.session["last_visit"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            response = redirect("/my2/session_index/")
            return response
        else:
            check_ret = "账号密码有误"
            return render(request, "app02_login.html", locals())

    form_reg_data = Form_Reg()  # 用django的form组件在get请求下渲染网页
    return render(request, "app02_login.html", locals())

def session_index(request):
    login_status = request.session.get("is_login") #如果is_login有true,表示认证通过
    if login_status:
        user = request.session.get("user") #获取用户信息
        last_visit = request.session.get("last_visit") #获取登陆时间
        return render(request, "app02_index.html", {"user": user,"last_visit":last_visit})
    else:
        return redirect("/my2/session_log/")

Session的设置项

SESSION_ENGINE = 'django.contrib.sessions.backends.db'      # session持久存储在数据库 (默认)
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  # session记录优先从缓存中取,如果没有则从数据库取
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’   # session 存储在缓存中
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
 
SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输

SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后才保存
#通过查看django的源代码"middleware.py"才知道下面两个参数只有在settings.SESSION_SAVE_EVERY_REQUEST 为True时才有效。
#并且SESSION_COOKIE_AGE 和 SESSION_EXPIRE_AT_BROWSER_CLOSE 只能设置选择一个,
#设置了SESSION_EXPIRE_AT_BROWSER_CLOSE = True,那么SESSION_COOKIE_AGE 就失效了
SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)单位秒
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期

Session的删除

request.session.pop(key)
返回session中对应的key,并将其从session中删除

del request.session[key]
删除的是客户端保存在服务端上的信息

request.sesion.clear()  就是清除session中的缓存数据(不管缓存与数据库的同步)
request.session.flush() 删除缓存,同时删除数据库的记录
代码示例:
def session_logout(request):
    if request.session.get("is_login"):
        request.session.flush()
        return redirect("/my2/session_log/")

session有效时间

设置有效时间
request.session.set_expiry(10)  #设置session的超期时间,或者在setting.py里进行全局设置
datetime对象: 会在datetime指定时间之后失效
0: 关闭浏览器之后就失效
None: 依赖全局的session失效策略配置
清除有效时间
request.session.clear_expired()#清除数据库中所有已经超期的session记录

查看有效时间
request.session.get_expiry_age()
request.session.get_expiry_date()
原文地址:https://www.cnblogs.com/Young-shi/p/15339177.html