cookie与session
一、cookie与session
它们的作用是:保存信息
背景:因为http协议是无状态的
cookie:保存在客户端浏览器上的键值对。
session:保存在服务端上的键值对。
原理:
当你第一次登陆成功之后,服务端给你返回了一个随机字符串。
保存客户端浏览器上之后再次朝服务端发请求,只需要携带该随机字符串
服务端就能够识别当前用户身份,无需再登。



注意:
cookie虽然是保存在客户端的浏览器上的 但是是服务端设置的
浏览器也是可以拒绝服务端对要求 不保存cookie。如果拒绝,就无法使用浏览器了。

如果关了cookie

二、cookie操作
views文件中
一定要利用HttpResponse类直接或间接产生的对象
1、设置
obj = HttpResponse('...')
obj.set_cookie(k,v)
obj.set_cookie(k,v,max_age/expire) 可以设置超时时间
'''''''''''
return HttpResponse('某某')
return render(...)
return redirect(...)
或者
obj = HttpResponse('某某')
return obj
obj1 = render(...)
return obj1
obj2 = redirect(...)
return obj2
'''''''''
2、获取
request.COOKIES.get(k)
3、删除
obj = HttpResponse('...')
obj.delete_cookie(k,v)
4、基于cookie写校验用户登录装饰器并且能够记住用户上一次想要访问的url

问题:需要保存用户的登录状态
修改


问题:当用户访问home时,要校验用户是否登录。
修改

问题:用户访问多个页面。都需要校验是否登录,这时要用装饰器。
修改:
#登录装饰器 from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args,**kwargs):
# 在执行装饰器函数之前做的事情 if request.COOKIES.get('username'): res = func(request,*args,**kwargs) return res else: return redirect('/login/') return inner #cookie登录 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'liuliu' and password == '123': # return HttpResponse('登录成功') # 注意仅仅返回登录成功是不够的,要的是登录后跳转到另一个页面 obj=redirect('/home/') # 生成一个对象,直接跳转到home页面 obj.set_cookie('username','jason666') #设置cookie。'jason666'这个地方不能用中文 return obj return render(request,'login.html') #定义一个跳转的home页面 @login_auth def home(request): # if request.COOKIES.get('username'): # return HttpResponse('我是home页面,只有登录的用户才能访问') # else: # return redirect('/login') return HttpResponse('我是home页面,只有登录的用户才能访问') #定义一个跳转的index页面 @login_auth def index(request): return HttpResponse('我是index页面,只有登录的用户才能访问') #定义一个跳转的demo页面 @login_auth def demo(request): return HttpResponse('我是demo页面,只有登录的用户才能访问')
问题:怎样拿到用户想访问的页面,并跳转到想访问的页面
两个方法
request.path_info
request.get_full_path()
print('request.path_info:',request.path_info) # 只拿路径部分 不拿参数
print('request.get_full_path():',request.get_full_path()) # 路径加参数


修改:
#登录装饰器 from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args,**kwargs): # print(request.path_info) # path_info是request对象的属性 # print(request.get_full_path()) # get_full_path()是request对象的方法 target_url = request.path_info # 获取用户想要访问的页面 if request.COOKIES.get('username'): res = func(request,*args,**kwargs) return res else: return redirect('/login/?next=%s'%target_url) # 在这里显示用户登录后直接跳转到想要访问的页面,这是利用了get请求方式 return inner #cookie登录 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'liuliu' and password == '123': # return HttpResponse('登录成功') # 注意仅仅返回登录成功是不够的,要的是登录后跳转到另一个页面 target_url = request.GET.get('next') #拿到用户想要访问页面的后缀 if target_url: obj=redirect(target_url) # 生成一个对象,直接跳转到home页面 else: # 如果用户没有想要访问的页面,就定向主页面去 obj=redirect('/home/') obj.set_cookie('username','jason666',max_age=3) #设置cookie。'jason666'这个地方不能用中文,max_age=3表示的是cookie值保存的时间 return obj return render(request,'login.html') #定义一个跳转的home页面 @login_auth def home(request): return HttpResponse('我是home页面,只有登录的用户才能访问') #定义一个跳转的index页面 @login_auth def index(request): return HttpResponse('我是index页面,只有登录的用户才能访问') #定义一个跳转的demo页面 @login_auth def demo(request): return HttpResponse('我是demo页面,只有登录的用户才能访问') #注销功能 @login_auth def logout(request): obj =HttpResponse('注销成功') obj.delete_cookie('username') return obj
三、session操作

django操作session默认需要使用内置的一张django_session表
如果没有执行过数据库迁移命令,会报错:no such table:django_session
django默认的超时时间为14天
1、设置
request.session['username'] = 'jason'
"""
01.产生一个随机字符串
02.取django session存储数据 session_key就是产生的随机字符串 session_data就是要保存的数据 expire_date超时时间
03.将产生的随机字符串返回给浏览器 浏览器本地保存键值对
sesssionid:随机字符串
"""
2、获取
request.session.get('username')
"""
01.自动取请求头中查找cookie锁携带的键值对 获取到随机字符串
02.拿着随机字符串取django_session表中比对数据
03.有的话就将对应的数据取出放到request.session中
"""
3、删除
request.session.flush() # 推荐
request.session.delete()
4、设置超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
session不一定非要存到数据库
文件
缓存数据库
数据
#设置session值 #要保存到哪呢?有很多地方,可以是数据库 def set_session(request): request.session['username']='jason666' #设置session值 request.session.set_expiry(5) # 设置值的保存时间 return HttpResponse('set_session') #获取session值 def get_session(request): print(request.session.get('username')) # 请求里携带着session值 return HttpResponse('get_session') #注销session值 def del_session(request): request.session.flush() return HttpResponse('注销了')

浙公网安备 33010602011771号