python框架之Django(7)-Cookie&Session使用
Cookie
添加
-
response.set_cookie
添加明文cookie
response.set_cookie(key, value='', max_age=None, expires=None, path='/',domain=None, secure=False, httponly=False)
-
response.set_signed_cookie
添加加密cookie
response.set_signed_cookie(key, value, salt='', **kwargs)
-
参数说明
key:键 value='':值 max_age=None:超时时间(单位为秒) expires=None:超时时间(针对IE) path='/': Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None:Cookie生效的域名 secure=False:https传输 httponly=False:只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
获取
-
request.COOKIES[key]
获取明文cookie。
request.COOKIES['key']
-
request.get_signed_cookie
获取加密cookie。
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
-
参数说明
default: 默认值 salt='': 加密盐 max_age=None: 后台控制过期时间
删除
-
delete_cookie
删除用户浏览器上之前设置的对应key的cookie。
response.delete_cookie(key, path='/', domain=None)
-
参数说明
key:键 path='/': Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None:Cookie生效的域名
示例
-
cookie版登陆校验
1 # 校验登录装饰器 2 def check_login(func): 3 @wraps(func) 4 def inner(request, *args, **kwargs): 5 next_url = request.get_full_path() 6 # 用登录时设置的盐获取指定key的cookie 7 if request.get_signed_cookie("isLogin", salt="salt", default=None) == "yes": 8 # 已经登录的用户 9 return func(request, *args, **kwargs) 10 else: 11 # 没有登录的用户,跳转到登录页面 12 return redirect("/login/?next={}".format(next_url)) 13 return inner 14 15 # 登录 16 def login(request): 17 if request.method == "POST": 18 username = request.POST.get("username") 19 passwd = request.POST.get("password") 20 if username == "username" and passwd == "password": 21 next_url = request.GET.get("next") 22 if next_url: 23 response = redirect(next_url) 24 else: 25 response = redirect("/home/") 26 # 设置cookie并加盐 27 response.set_signed_cookie("isLogin", "yes", salt="salt") 28 return response 29 return render(request, "login.html")
Session
添加
request.session[key] = value request.session.setdefault(key,value) # 存在则不设置
获取
request.session[key] request.session.get(key,default) # 未获取到值时使用默认值default
删除
del request.session[key]
相关方法
request.session.keys() # 获取所有键 request.session.values() # 获取所有值 request.session.items() # 获取所有键值 request.session.set_expiry(7) # 设置超时时间 request.session.session_key # 获取sessionid值 request.session.clear_expired() # 将所有Session失效日期小于当前日期的数据删除 request.session.exists(session_key) # 检查会话session的key(sessionid)在数据库中是否存在 request.session.delete() # 删除当前会话的所有Session数据 request.session.flush() # 删除当前的会话数据并删除会话的 request.session.set_expiry(value) Cookie # 设置会话Session和Cookie的超时时间 * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
示例
-
session版校验登录
1 from functools import wraps 2 3 4 def check_login(func): 5 @wraps(func) 6 def inner(request, *args, **kwargs): 7 next_url = request.get_full_path() 8 if request.session.get("user"): 9 return func(request, *args, **kwargs) 10 else: 11 return redirect("/login/?next={}".format(next_url)) 12 return inner 13 14 15 def login(request): 16 if request.method == "POST": 17 user = request.POST.get("user") 18 pwd = request.POST.get("pwd") 19 20 if user == "alex" and pwd == "alex1234": 21 # 设置session 22 request.session["user"] = user 23 # 获取跳到登陆页面之前的URL 24 next_url = request.GET.get("next") 25 # 如果有,就跳转回登陆之前的URL 26 if next_url: 27 return redirect(next_url) 28 # 否则默认跳转到index页面 29 else: 30 return redirect("/index/") 31 return render(request, "login.html") 32 33 34 @check_login 35 def logout(request): 36 # 删除所有当前请求相关的session 37 request.session.delete() 38 return redirect("/login/") 39 40 41 @check_login 42 def index(request): 43 current_user = request.session.get("user", None) 44 return render(request, "index.html", {"user": current_user})
相关配置
Java博客目录 | Python博客目录 | C#博客目录