cookie和session
一,什么是cookie
Cookie具体指的是一小段信息,他是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
二,Cookie的工作原理
cookie是由服务器产生的内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是‘谁’了。
三,django中操作cookie
登陆后,浏览器中添加cookie:
def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'jason' and password == '123': old_path = request.GET.get('next') if old_path: obj = redirect(old_path) else: obj = redirect('/home/') # 用户登录成功 朝浏览器设置一个cookie obj.set_cookie('name','jason',expires=7*24*3600) # expires:保存cookie的时间,单位是秒 return obj return render(request,'login.html')
制作登陆校验装饰器:
from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args,**kwargs): # 校验cookie # print(request.get_full_path()) # 拿到需要登陆校验的路径 old_path = request.get_full_path() if request.COOKIES.get('name'): return func(request,*args,**kwargs) return redirect('/login/?next=%s'%old_path) return inner
删除cookie:
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值 return rep
四,什么是session:
cookie虽然在一定程度上解决了保持状态上的要求的需求,但是由于cookie本身的需最大只支持4096字节,以及cookie本生存在客户端,可能被拦截或者窃取,所以我们需要一些新的东西能支持更多的字节,并且保存在服务器,有较高的安全性。这就是session。
案例:
登陆后添加session:
def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") if user == "alex" and pwd == "alex1234": # 设置session request.session["user"] = user # 获取跳到登陆页面之前的URL next_url = request.GET.get("next") # 如果有,就跳转回登陆之前的URL if next_url: return redirect(next_url) # 否则默认跳转到index页面 else: return redirect("/index/") return render(request, "login.html")
制作校验登陆状态的装饰器:
def 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=%s"%next_url) return inner
设置session:request.session['name'] = 'jason'
1:先生成了一个随机的字符串
2:在django session表中存储该随机字符串与数据的记录
3:将随机的字符串发送个客户端浏览器
获取session:request.session.get('name')
1:django自动获取浏览器中随机字符串取django session表里面的进行对比
2:如果比对成功 会将当前随机字符串对应的数据赋值给request.session
3:通过requset.session操作该数据(数据不存在也不会影响我们的业务逻辑)
删除当前会话的所有session数据
requset.session.delete()
删除当前的会话数据并删除会话的cookie
request.session.flush() :(用于确保前面的会话数据不可以再次被用户的浏览器访问)
设置会话session和cookie的超出时间
request.session.set_expiry(value)
如果value是个整数.session会在数秒之后失效。
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略。
django默认的session存活时间是两周(14天)