文章目录
Django cookie、session与CBV装饰器
cookie与session
扩充:
由于HTTP协议是无状态的。因此它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受到前面的请求请求响应情况直接影响,也不会直接影响后面的请求响应情况。对服务器来说,每次的请求都是全新的。状态可以理解为客户端和服务端在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。而会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。
什么是Cookie
Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
查看Cookie
右键浏览器页面点击检查即可
Django中操作Cookie
- 设置cookie
obj = HttpResponse(...)
obj = render(request, ...)
obj.set_cookie(key,value, max_age=None)
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(针对IE浏览器使用)
- 删除cookie
obj = HttpResponse(...)
obj = render(request, ...)
obj.delete_cookie(key) # 根据key删除浏览器上之前设置的值
- 获取cookie
request.COOKIES.get(key) # 根据key获取值
- 依据cookie登录实现登录验证
后端核心代码:
def c_login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'Upython' and password =='123':
obj = redirect('/home/')
# 登陆后设置cookie
obj.set_cookie('username', 'Upython')
# 登录后进入home页面
return obj
return render(request,'c_login.html')
# home页面
def home(request):
# 只有cookie值为Upython的时候才能进入
if request.COOKIES.get('username') == 'Upython':
return HttpResponse('欢迎来到home页面')
# 没有cookie值时,重定向到登录页面
return redirect('/c_login/')
# 退出
def c_quit(request):
obj = redirect('/c_login/')
# 删除cookie值
obj.delete_cookie('username')
# 重定向到登录页面
return obj
- 效果
什么是Session
由于Cookie以文本的形式保存在本地,自身安全性较差,并且Cookie本身最大支持4096字节,因此就需要一种新的东西,它能支持更多字节,并且保存在服务器,有较高的安全性,于是就有了Session
简单点说,session就是以k:v键值对保存在服务端的数据(可以有多个),session是基于cookie使用的。给客户端放回的是一个随机字符串(k), sessionid : k
Django中操作session
注意: Django中session默认存储位置在Django默认的数据表(django_session)中,里面有3个字段
- 设置session
request.session['key'] = value
"""
内部发送了那些事
1.django内部会自动帮你生成一个随机字符串
2.django内部自动将随机字符串和对应的数据存储到django_session表中
2.1先在内存中产生操作数据的缓存
2.2在响应结果django中间件的时候才真正的操作数据库
3.将产生的随机字符串返回给客户端浏览器保存
"""
设置过期时间 django中默认session的过期时间是14天,但是可以人为修改
request.session.set_expiry()
括号内可以放四种类型的参数
1. 整数 多少秒
2. 日期对象 到指定日期就失效
3. 0 一旦当前浏览器窗口关闭立刻生效
4. 不写 失效时间取决于django默认
- 获取session
request.session.get('key')
"""
内部发送了那些事
1.自动从浏览器请求中获取sessionid对应的随机字符串
2.拿着该随机字符串去django_session表中查找对应的数据
3.
如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
如果比对不上 则request.session.get()返回的是None
"""
- 清除session
request.session.delete() # 只删除服务端 客户端不删除
request.session.flush() # 浏览器和服务端都清空(推荐使用)
- 补充知识
-
session是保存在服务端的 但是session的保存位置可以有多种选择
-
MySQL
-
文件
-
redis
-
memcache
…
-
-
django_session表中的数据条数是取决于浏览器的
同一个计算机(IP地址)同一个浏览器只会有一条数据生效(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过代码清除)
- 依据session实现登录验证
# 登录
def s_login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'Upython' and password == '123':
# 设置session值
request.session['username'] = '123'
return redirect('/s_home/')
return render(request,'s_login.html')
# 首页
def s_home(request):
# 只有当session值为'123'时才能到home页面
if request.session.get('username') == '123':
return HttpResponse('欢迎来到home页面')
return redirect('/s_login/')
# 退出
def s_quit(request):
# 删除session值
request.session.flush()
return redirect('/s_login/')
效果:
扩展:
由于session是保存在服务端的,但数据量过大时会影响整个系统的运行效率,因此,token出现了
- 使用token后服务端不再保存数据
- 登陆成功之后 将一段用户信息进行加密处理(加密算法之后你公司开发知道)
- 将加密之后的结果拼接在信息后面 整体返回给浏览器保存
- 浏览器下次访问的时候带着该信息 服务端自动切去前面一段信息再次使用自己的加密算法跟浏览器尾部的密文进行比对
CBV添加装饰器三种方式
- CBV在django中不建议直接给类的方法加装饰器,无论该装饰器是否能正常给,都不建议直接加
- 因此需要用到 method_decorator 方法
from django.views import View
from django.utils.decorators import method_decorator
# 方式2(可以添加多个针对不同的方法加不同的装饰器)
# @method_decorator(login_auth,name='get')
# @method_decorator(login_auth,name='post')
class MyLogin(View):
# 方式3: 装饰dispatch方法 它会直接作用于当前类里面的所有的方法(dispatch是django内置方法 下面三行固定写法)
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
# @method_decorator(login_auth) # 方式1:指名道姓
def get(self,request):
return HttpResponse("get请求")
def post(self,request):
return HttpResponse('post请求')