cookie与session
cookie与session简介
早期的web不需要什么用户注册,所有用户都给一样的界面,不需要什么状态保存,随着互联网的发展,我们很多web框架的应用需要保存用户的状态。
cookie
保存在客户端与用户状态相关的信息
session
保存在服务端与用户状态相关的信息
ps:session的工作需要依赖于cookie
补充:浏览器有资格拒绝保存服务端发送过来的cookie数据(在浏览器设置中拒绝保存cookie)
django操作cookie
要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收
obj1 = render()
return obj1
request.COOKIS 里携带了cookis键值对
def login_func(request):
res = HttpResponse('登录')
res.set_cookie('name','jason') # 让浏览器保存键值对
return res
def home_func(request):
print(request.COOKIES.get('name')) # 拿到键值对
return HttpResponse('主页')
cookie写用户登录功能
def login_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'tank' and password == '123':
obj = redirect('/home/') # 重定向
obj.set_cookie('name',username) # 让重定向的结果保存一个cookie
return obj
return render(request, 'loginPage.html')
def home_func(request):
if request.COOKIES.get('name'): # 判断cookie内有没有数据
return HttpResponse('主页')
else:
return redirect('/login/')
问题是如果有很多功能都需要登录后可以访问代码重复率太高,考虑使用装饰器
def login_auth(func_name):
def inner(request,*args,**kwargs):
if request.COOKIES.get('name'):
res = func_name(request,*args,**kwargs)
return res
return redirect('/login/')
return inner
缺点是无法返回到用户没有登录前的那个页面
print(request.path) # 只获取路由
print(request.path_info) # 只获取路由
print(request.get_full_path()) # 可以获取到路由和?后面携带的数据
利用request_path_info 拿到用户登录之前的路由并携带给登录页面,在登录功能函数内 拿到该路由 如果有值则跳转到该路由 没有值跳转回主页
# Create your views here.
def login_auth(func_name):
def inner(request, *args, **kwargs):
print(request.path_info)
ret = request.path_info # 获取到用户跳转到登陆之前的路由名
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
return redirect('/login/?next=%s' % ret) # 没登录跳转到登录页面并把之前网址的路由携带过去
return inner
def login_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'tank' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path)
else:
obj = redirect('/home/')
obj.set_cookie('name', username) # 让重定向的结果保存一个cookie
return obj
return render(request, 'loginPage.html')
@login_auth
def home_func(request):
return HttpResponse('主页')
@login_auth
def home1_func(request):
return HttpResponse('home1')
@login_auth
def home2_func(request):
return HttpResponse('home2')
django操作session
session是保存在服务端上的数据就应该有一个表来保存。django自带了该表,只需要执行数据库迁移命令就会生成一个django_session表
def set_se_func(request):
request.session['desc'] = '头好晕啊,啥时候能恢复身体啊'
return HttpResponse('回家吧')
当我们在访问这个路由时,便会往django_session表 内插入一个随机的字符串(密文)并且含有到期时间。默认14天。
1.生成一个随机字符串
2.对value数据做加密处理 并在django_session表中存储
随机字符串>>>加密数据
3.将随机字符串也发送一份给客户端保存(cookie)
sessionid:随机字符串
# 获取sesion
request.session.get()
1.自动获取随机字符串
2.去django_session表中根据随机字符串获取加密的数据
3.自动解密数据并处理到request.sesion.get()中
也可以设置过期时间
request.session.set_expiry(秒)