cookie和session django中间件
一、cookie和session
1. 为什么要有cookie和session
- 目的是为了保存客户端的用户状态
- http协议是无状态的
二、cookie
1. 什么是cookie
- 简单来说,cookie就是保存在客户端浏览器上的键值对
- 浏览器中保存的cookie即这些键值对是由服务端设置的,再保存到客户端浏览器上。浏览器有权禁止cookie的写入(就是浏览器不保存cookie)
2. django中关于cookie的使用
(1)后端设置cookie
- 之前在django后端的视图层中,视图函数最后返回的都是
HttpResponse
对象,但现在,我们操作cookie,则需要使用HttpResponse
对象来设置cookie - 通过
HttpResponse对象.set_cookie('key','value')
语句来设置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') # 登陆成功后要跳转的url(使用登陆认证装饰器在登陆的url后面携带get请求参数——》 ?next=url)
if old_path: # 防止用户直接访问的login页面
obj = redirect(old_path)
else:
obj = redirect('/home/') # 默认跳转到首页 当用户没有想要访问的网址
obj.set_cookie('whoami','jason') # 告诉浏览器保存一个键值对
return obj
return render(request,'login.html')
(2)后端获取cookie
通过
request.COOKIES.get(key)
语句来获取cookie实例:设计登陆认证装饰器
from functools import wraps
def login_auth(func):
@wraps(func) # wraps作用是 修复被装饰的函数
def inner(request,*args,**kwargs):
# 判断当前用户是否登录
# print('request.path_info:',request.path_info) # 只获取url
# print('request.get_full_path():',request.get_full_path()) # url+get请求的参数
if request.COOKIES.get('whoami'):
res = func(request,*args,**kwargs)
return res
else:
target_path = request.path_info
return redirect('/login/?next=%s'%target_path)
return inner
(3)设置cookie的超时时间
- cookie的超时时间是指该cookie在浏览器上能够保存的时间,从该cookie在浏览器上出现开始计算。
- 设置语法:
HttpResponse对象.set_cookie('key','value',max_age=n)
HttpResponse对象.set_cookie('key','value',expires=n)
- 最后的一个参数都是设置超时时间,并且都是以秒为单位
- 区别:如果你要给IE浏览器设置cookie的超时时间,你只能用
expires
(4)删除cookie
删除cookie会让浏览器立马清楚其保存的响应的键值对
删除语法:
HttpResponse对象.delete_cookie(key)
实例:登出/注销功能
@login_auth
def logout(request):
obj = redirect('/home/')
obj.delete_cookie('whoami')
return obj
三、session
1. 什么是session
- session是保存在服务端上的键值对,在客户端的cookie中也保留一个session的键。
- session的工作机制需要依赖于cookie
- 客户端浏览器上的cookies的其中之一的一个键值对是
sessionid:session的键生产的随机字符串
- 客户端浏览器上的cookies的其中之一的一个键值对是
- session的键其实是世界上唯一的一个字符串,值是我们自定义的一些数据。虽然在我们设置session时,自己给出了一个任意的字符串当做session的key,但是django后端会自动将该key转变成一个世界上唯一的字符串,并且还将这个key对应的值进行加密,最后默认保存在数据库
django_session
表中(当然也可以通过修改一些设置,让session保存在其他本地文本文件中或内存中)。
2. django中关于session的使用
(1) 设置session
设置session语法:
request.session[key] = value
- 第一次设置的时候可能会报错,是因为你没有执行数据库迁移命令生成django需要用到的一些默认表(django_session)
django默认的session失效时间是14天
当执行
request.session[key] = value
这句语句时发生的事:- djang内部自动帮你调用算法生成一个随机的字符串作为session的key,并把该key对应的值进行加密
- 在django_session表中添加数据(数据保存方式: 随机字符串 加密后的数据 失效时间)
- 将产生的随机字符串返回给客户端浏览器 让浏览器保存
注意:一个项目中,其数据库的django_session表中,无论有多少个session,通过同一种浏览器设置的session只会保存在一行记录中。不同浏览器设置的session才会保存在不同的行中。
(2)获取session
- 语法:
request.session.get(key)
。key
是我们之前设置session时,指定的key,不是生成的那个随机字符串。 - 当执行
request.session.get(key)
时发生的事:- django内部会自动去请求头里面获取cookie
- 拿着sessionid所对应的随机字符串去django_sessoion表中一一比对
- 如果比对上了,会将随机字符串对应的数据获取出来,自动放入request.session中供程序员调用,如果没有就是一个空字典
(3)设置失效时间
语法:
request.session.set_expiry(value)
- 如果value是个整数,session会在些秒数后失效。
- 如果value是个datatime或timedelta,session就会在这个时间后失效。
- 如果value是0,用户关闭浏览器session就会失效。
- 如果value是None,session会依赖全局session失效策略。
失效时间是指到了这个时间,保存在服务端的django_session表中的这个session数据就没用了。之后会被删除。且客户端浏览器上的sessionid的这个cookie也会失效。
(4)删除session
- 语法:
request.session.delete()
- 客户端和服务端的关于session的会全部删除,数据库中只会根据浏览器的不同删对应的数据
request.session.flush()
- 该方法只会删除浏览器上的sessionid的那个cookie,服务端的只会到了失效时间后再删除(建议使用这个)
四、token
- 也比较常用的一种类似session的东西
- 点我查看token详情
五、django中间件
- django中间件的作用非常强大,请求数据到后端要经过中间件,视图函数响应的数据(return返回的数据)也要经过中间件。
- 数据在通过中间件时,中间件都有各自独立的功能,在特定情况下对数据做相应的处理。
- django默认有七个中间件
- django支持自定义中间件
- django中间件的作用
- 全局的用户登录校验
- 全局的用户访问频率校验
- 全局的用户权限校验()
1. 数据通过django中间件的流程
(1)正常流程
- 请求数据到django后端的django中间件后,按照从上到下的顺序依次通过settings文件中
MIDDLEWARE
中书写的各个中间件——》 - 数据到视图层,视图层再返回响应数据——》
- 响应数据再按照从下到上的顺序依次通过settings文件中
MIDDLEWARE
中书写的各个中间件。
(2)特殊情况
- 当中间件中的
process_request
方法返回了一个HttpResponse对象,那么请求会立刻停止往后面走(下面的中间件和之后的视图函数都不走),立即原路返回
2. django中间件中常用的方法
- django各个中间件中一般都含有一个
process_request
和process_response
方法 - 这些方法都含有
request
形参,放在self
之后 - 如果形参中含有response 那么必须要返回,若返回其他,则响应数据就会变成其他。
(1)process_request
请求来的时候会按照settings配置文件中从上往下的顺序,依次执行每一个中间件内部定义的
process_request
方法当请求数据走到中间件时,会执行该方法。若该中间件没有该方法,则会跳过该中间件继续走下一个中间件
该方法一旦返回了HttpResponse对象,那么请求会立刻停止往后走,立即原路返回(当
process_request
方法直接返回HttpResponse对象之后,会直接从当前中间件里面的process_respone
往回走)方法参数:
def process_request(self,request):
(2)process_response
视图函数返回的响应数据走的时候,会按照settings配置文件中从下往上的顺序,依次执行每一个中间件内部定义的
process_response
方法该方法必须有两个形参
request,response
,并且必须返回response
形参,不返回直接报错该方法返回什么(HttpResponsed对象) 前端就能获得什么,即该方法返回的数据会覆盖掉之前视图函数返回的响应数据。并且若该中间件上面的中间件的
process_response
方法也返回了HttpResponsed对象,则会再把该中间件的返回数据再覆盖掉。方法参数:
def process_response(self,request,response):
(3)process_view
路由匹配成功之后执行视图函数之前触发该方法
如果该方法返回了HttpResponse对象 那么会从下往上一次经过每一个中间件里面的
process_response
方法方法参数:
def process_view(self,request,view_name,*args,**kwargs): # view_name 是要执行的视图函数的内存地址
(4)process_template_response
当你返回的对象中含有
render
属性指向的是一个render方法的时候才会触发,从下往上的顺序方法参数:
def process_template_response(self, request, response):
实例
# 让后端视图函数中返回的对象含有render属性的方式
def mdzz(request):
print('我是视图函数mdzz')
def render():
return HttpResponse('你好呀 我是奇葩')
obj = HttpResponse('我很好 好的像个傻逼一样')
obj.render = render
return obj
# 响应数据变成了: 我是视图函数mdzz
(5)process_exception
当视图函数中出现错误,会自动触发,顺序是从下往上
方法参数:
def process_exception(self, request, exception):
3. 自定义中间件
- 注意:django暴露给用户五个可以自定义的方法(就是上面提到的5个django中间件常用的方法)来自定义中间件
(1)自定义中间件的步骤
在应用文件下(如:app01)新建一个任意名字的文件夹(如:mymddleware)
在mymddleware文件下新建一个任意名字的py文件(如:mymdd.py)
导入方法
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,render,redirect
在mymdd文件中自定义类,一个类就是一个中间件。类内部写上面提到的5个django中间件中常用的方法
在settings文件的
MIDDLEWARE
变量值中添加自定义的中间件路径MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.mymiddleware.mymdd.MyMdd1', # 添加自定义中间件
'app01.mymiddleware.mymdd.MyMdd2', # 添加自定义中间件
]
(2)自定义django中间件实例
class MyMdd1(MiddlewareMixin):
def process_request(self,request):
print('我是第一个中间件里面的process_request方法')
# return HttpResponse("我是中间件一里面的")
def process_response(self,request,response):
"""
:param request:
:param response: 就是后端返回给前端的数据
:return:
"""
print('我是第一个中间件里面的process_response方法')
return response
# return HttpResponse("我是中间件一里面的")
def process_view(self,request,view_name,*args,**kwargs):
print(view_name)
print(args)
print(kwargs)
print('我是第一个中间件里面的process_view方法')
# return HttpResponse("我是中间件一里面的process_view")
def process_exception(self,request,exception):
print('我是第一个中间件里面的process_exception')
print(exception)
def process_template_response(self, request, response):
print('我是第一个中间件里面的奇葩方法')
return response
class MyMdd2(MiddlewareMixin):
def process_request(self,request):
print('我是第二个中间件里面的process_request方法')
# return HttpResponse('我是中间件二里面的')
def process_response(self,request,response):
"""
:param request:
:param response: 就是后端返回给前端的数据
:return:
"""
print('我是第二个中间件里面的process_response方法')
return response
# return HttpResponse("我是中间件二里面的")
def process_view(self,request,view_name,*args,**kwargs):
print(view_name)
print(args)
print(kwargs)
print('我是第二个中间件里面的process_view方法')
# return HttpResponse("我是中间件二里面的process_view")
def process_exception(self, request, exception):
print('我是第二个中间件里面的process_exception')
print(exception)
def process_template_response(self, request, response):
print('我是第二个中间件里面的奇葩方法')
return response
cookie和session django中间件的更多相关文章
- cookie与session django中间件
目录 一.什么是cookie 二.django中操作cookie 2.1 如何操作cookie 2.2 操作cookie 三.什么是session 四.django中操作session 4.1 创建c ...
- day13 cookie与session和中间件
day13 cookie与session和中间件 今日内容概要 cookie与session简介 django操作cookie与session django中间件简介 如何自定义中间件 csrf跨站请 ...
- Django --- cookie与session,中间件
目录 1.cookie与session 1.cookie 2.session 2.中间件 1.中间件作用 2.用户可以自定义的五个方法 3.自定义中间件 1.cookie与session 1.cook ...
- Django之cookie与session、中间件
目录 cookie与session 为什么会有cookie和session cookie 设置cookie 获取cookie 删除cookie 实例:cookie版登录校验 session 设置ses ...
- Django框架-cookie和session以及中间件
目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...
- cookie、session和中间件
目录 cookie和session cookie与session原理 cookie Google浏览器查看cookie Django操作cookie 获取cookie 设置cookie 删除cooki ...
- cookie、session以及中间件
cookie cookie是保存客户端浏览器上的键值对,是服务端设置在客户端浏览器上的键值对,也就意味着浏览器其实可以拒绝服务端的'命令',默认情况下浏览器都是直接让服务端设置键值对 设置cookie ...
- django的cookie和session以及内置信号、缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- django的cookie和session以及缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
随机推荐
- TensorFlow实战第六课(过拟合)
本节讲的是机器学习中出现的过拟合(overfitting)现象,以及解决过拟合的一些方法. 机器学习模型的自负又表现在哪些方面呢. 这里是一些数据. 如果要你画一条线来描述这些数据, 大多数人都会这么 ...
- K8s之Projected Volume
四种:Secret .ConfigMap.Downward API.ServiceAccountToken 1.Secret Secret:帮你把Pod想要访问的加密数据,存放到Etcd中,然后,通过 ...
- XML JS Demo
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 编译FFMPEG错误对策
在MINGW32下编译ffmpeg-2.1.1.tar.bz2 step1: ./configure --prefix=/home/Administrator/install --extra-cf ...
- 小记---------spring框架之IOC理解
Spring是一个开源框架,是一个轻量级的Java开发框架. Spring的核心是控制发转(IOC)和面向切面(AOP) 控制发转(IOC):指的是 对象的创建权反转(交给)给 Spring. 作 ...
- Python3学习笔记-更新中
1.Python概况 2.Anaconda安装及使用 3.Pycharm安装及使用 4.Hello World!!! 5.数据类型及类型转换 6.分支结构 7.循环语句 8.异常
- MySQL 如何更改某一用户及伞下成员的path
MySQL 如何更改某一用户及伞下成员的path 在有的系统中,推荐关系的维护不只是pid那么简单,为了某些业务,可能还会需要维护path字段,path字段的存在,优点在于查询方便,最起码不用递归了 ...
- 如何用纯 CSS 创作一个慧星拖尾效果的 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YLRLaM 可交互视频教 ...
- LCT做题笔记
最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...
- qq 面对面传文件,应用
使用方式:打开qq,点击右上角里面的面对面传 传输内容:应用,文件 好处:不耗流量,快速