Django cookie、session与CBV装饰器
文章目录
- Django cookie、session与CBV装饰器
- cookie与session
- 什么是Cookie
- 查看Cookie
- Django中操作Cookie
- 什么是Session
- Django中操作session
- CBV添加装饰器三种方式
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/')# 登陆后设置cookieobj.set_cookie('username', 'Upython')# 登录后进入home页面return objreturn 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请求')
Django cookie、session与CBV装饰器相关推荐
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- django Cookie,Session和自定义分页
因为HTTP协议是无状态的,每发送完请求后都会断开链接,所以有时为了保存 状态用到cookie和session cookie 是保存在浏览器上的,session是保存在后台的 cookie相当于一个口 ...
- cbv装饰器 中间件 跨站请求伪造
给cbv下面的函数加装饰器 写一个验证用户登录的程序 前端页面 # 写一个装饰器验证session def login_auth(func):def inner(request,*args,**kwa ...
- Python攻城师的成长————Django框架(csrf相关装饰器、基于中间件思想编写项目、auth认证模块)
今日学习目标 逐步掌握csrf相关装饰器.基于中间件思想编写项目.auth认证模块知识点 文章目录 今日学习目标 学习内容 一. csrf相关装饰器 二.基于中间件思想编写项目 三.auth认证模块 ...
- dj鲜生-27-登陆装饰器-使用django内置的登陆装饰器
部分页面要求登陆后可见 没有登陆的用户,不让他访问 使用登陆验证装饰器实现 使用说明 导入函数 from django.contrib.auth.decorators import login_req ...
- asp.net javascrip获取session的值_一篇文章搞定 Django Cookie 与 Session
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- Django中六个常用的自定义装饰器
装饰器作用 decorator是当今最流行的设计模式之一,很多使用它的人并不知道它是一种设计模式.这种模式有什么特别之处? 有兴趣可以看看Python Wiki上例子,使用它可以很方便地修改对象行为, ...
- Django之session验证的三种姿势
一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...
- Python学习---django知识补充之CBV
Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> ...
最新文章
- 30行Python代码实现高分辨率图像导航
- Centos 安装Mongo DB
- 结构化数据建模——titanic数据集的模型建立和训练(Pytorch版)
- Toad9.7与Oracle11g在X86的Win7下的情况
- 致命错误: 在类路径或引导类路径中找不到程序包 java.lang_如何提升店铺动态评分 需要提升可以找我...
- 老鸟对菜鸟的一些建议
- pivot unpivot_静态和动态SQL Pivot和Unpivot关系运算符概述
- C++递归以及内存值的传递
- CMU德扑AI赌神,现已拿下美军千万美元大单
- 探讨专线与家用宽带的区别
- jfreechart环形图完美实现
- 解决Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.20问题
- 阿里巴巴内部资料:2018全技术栈图册ppt分享
- 什么是ANC降噪技术?耳机工厂来告诉你
- Solidity函数中pure、view、constant的用法
- 双机串行通讯实验c语言编程,51单片机编程:教你实现双机串行通信功能
- UE5 c++ 写一个livelink插件
- fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统
- 教你用 CSS 实现超真实的 3D 相册,让你的照片立体感 UPUP
- 世界上最成功的人一开始是个程序员-《程序员大本营》1999版