Session与Cookie
cookie
服务端保存在客户端浏览器上的信息都可以教cookie
表现形式一般是k:v键值对(可以多个)
优化:
随机字符串1:用户1相关信息
随机字符串2:用户2相关信息
session
数据是保存在服务端
表现形式一般是k:v键值对
session是基于cookie工作。(大部分保存用户状态的操作都需要cookie)
token
session虽然数据保存在服务端,但是禁不住数据量大。
服务端不再保存数据
登陆成功后,将一段信息进行加密处理(加密算法是自己开发)
将加密后的结果拼在信息后面,整体返回给浏览器保存
浏览器下次访问带着该数据信息,服务端自动切去前面一段信息再次使用自己加密算法
跟浏览器尾部的密文进行对比
jwt认证
三段信息,后续补充。。。。
Cookie操作
浏览器禁用cookie,网站保存账户功能失效。
获取Cookie
request.COOKIES当成一个字典
request.COOKIES['key'] 或者 request.COOKIES.get('username') username是key
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
- default: 默认值
- salt: 加密盐
- max_age: 后台控制过期时间
设置Cookie
一定要用HttpResponse类直接或者间接产生的对象
obj = HttpResponse(...)
obj = render(request, ...)obj.set_cookie(key,value,...)
obj.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
参数:
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖
删除Cookie
obj = HttpResponse(...)
obj = render(request, ...)
obj.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
Cookie版登陆校验
def check_login(func):@wraps(func)def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":# 已经登录的用户...return func(request, *args, **kwargs)else:# 没有登录的用户,跳转刚到登录页面return redirect("/login/?next={}".format(next_url))return innerdef login(request):if request.method == "POST":username = request.POST.get("username")passwd = request.POST.get("password")if username == "xxx" and passwd == "dashabi":next_url = request.GET.get("next")if next_url and next_url != "/logout/":response = redirect(next_url)else:response = redirect("/class_list/")response.set_signed_cookie("login", "yes", salt="SSS")return responsereturn render(request, "login.html")@check_login
def home(request):return HttpResponse("home页面,只有登陆了才能查看~")
session操作
note:
1. django 默认存放django_session。需要迁移命令生成表格,才能存放session,也可以保存到其他地方。
2. django中默认的session超时时间为14天
request.session['key'] = value 1.django内部会自动生成一个随机字符串2.去django_session表中存储数据 键就是随机字符串 值是要保存的数据(中间件干的)3.将生成好的随机字符串返回给客户端浏览器 浏览器保存键值对sessionid 随机字符串 request.session.get('key')1.django会自动取浏览器的cookie查找sessionid键值对 获取随机字符串2.拿着该随机字符串取django_session表中比对数据3.如果比对上了 就将随机字符串对应的数据获取出来并封装到request.session供用户调用
1. django session表中的数据条数取决于浏览器
同一台计算机同一个浏览器指挥有一条
设置session与cookie的超时时间
request.session.set_expiry(value)* 整数,session会在些秒数后失效。* datatime或timedelta,session就会在这个时间后失效。* 0,用户关闭浏览器session就会失效。* 不写(none),session会依赖全局session失效策略。
删除session
request.session.flush() #浏览器和服务端都清空,推荐使用。
Session登陆验证
from functools import wrapsdef check_login(func):@wraps(func)def inner(request, *args, **kwargs):next_url = request.get_full_path()if request.session.get("user"):return func(request, *args, **kwargs)else:return redirect("/login/?next={}".format(next_url))return innerdef login(request):if request.method == "POST":user = request.POST.get("user")pwd = request.POST.get("pwd")if user == "alex" and pwd == "alex1234":# 设置sessionrequest.session["user"] = user# 获取跳到登陆页面之前的URLnext_url = request.GET.get("next")# 如果有,就跳转回登陆之前的URLif next_url:return redirect(next_url)# 否则默认跳转到index页面else:return redirect("/index/")return render(request, "login.html")@check_login
def logout(request):# 删除所有当前请求相关的sessionrequest.session.delete()return redirect("/login/")@check_login
def index(request):current_user = request.session.get("user", None)return render(request, "index.html", {"user": current_user})
补充:
有时一些数据可以存入session,django_session表中。
eg:验证码
参考:https://www.cnblogs.com/guyouyin123/p/12297103.html