cookie与session django中间件
一、什么是cookie
1、由于BS架构基于HTTP协议,是无状态的,不能保存客户端状态
2、使用cookie/session技术可以保存客户端用户状态
3、cookie是服务端生成发送给客户端的键值对,浏览器会保存它
4、浏览器可以设置禁止cookie的写入,即不保存cookie
二、django中操作cookie
2.1 如何操作cookie
视图函数都是返回一个对象,只需要给这个对象进行操作就可以了
# 一般有三种方式返回数据
obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj
2.2 操作cookie
1、生成cookie
# 生成cookie
obj.set_cookie('k1','v1',max_age=3)
obj.set_cookie('k1','v1',expires=3)
'''
1、客户端接收到的数据为键值对 k1:v1
2、参数max_age与expires都是设置cookies的有效时间,区别在于,当客户端为IE浏览器时,只能用expires
'''
2、服务端获取cookie
request.COOKIES.get('k1') # 获取cookie值
3、删除cookie
obj.delete_cookie('k1')
'''
删除cookie意味着注销客户端用户
定义注销视图函数即可'''
def logout(request):
obj = redirect('/login/')
obj.delete_cookie('user')
三、什么是session
1、在服务端基于cookie保存客户端状态的数据,一般存储在数据库中
2、每一个客户端的cookie分配唯一的一个id
四、django中操作session
4.1 创建cookie_session表
1、在django项目第一次创建表,迁移同步到数据库中时,会默认创建多个表,其中包括diango_sessioon表
2、在django_session表创建完成的情况下,才能操作session
4.2 操作session
1、设置session
request.session['k1'] = 'v1'
'''
1、使用的k1:v1键值对,是生成cookie的相同的键值对
2、django内部自动调用算法生成一个随机的字符串
3、django_session表中添加数据
以2中生成的字符串为主键session_key
给数据加密生成字符串,添加进session表中session_data
同时,自动生成session有效期限,mysql默认为14天
'''
2、获取session
request.session.get('k1')
'''
1、django内部会自动去请求头里面获取cookie
2、拿着session所对应的 随机字符串去django_session表中以一比对session_key
3、如果比对上了,获取对应的session_data,放入request.session中,以供程序员调用
4、如果没有比对上,那么request.session就是一个空字典
'''
3、删除session
request.session.delete()
'''
1、一个客户端对应django_session表中的一条数据
2、删除session,就是将该客户端对应的所有cookie删除
'''
4、设置失效时间
request.session.set_expiry(value)
'''
1、value是个整数,时间单位是秒
2、value是个datatime或者timedelta,那就是最后的有效期
3、value是0,用户关闭浏览器就会 失效
4、value是None,session会依赖全局session失效策略
'''
五、示例:登陆认证
1、校验cookie/session
2、验证不通过,重新登陆后自动跳转本来想要访问的页面
3、使用CBV模式
def login_auth(func):
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
print(next_url)
print(request.session.get('username'))
if request.session.get('username'):
return func(request, *args, **kwargs)
else:
return redirect('/app01/login/%s/' % next_url)
return inner
class MyLogin(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
username = request.POST.get('username')
password = request.POST.get('password')
user_obj = models.User.objects.filter(username=username, password=password)
if not user_obj:
return render(request, 'login.html')
request.session['username'] = username
url = reverse('home', kwargs={'username': username})
obj = redirect(url)
obj.set_cookie('username', username)
return obj
class MyHome(View):
@method_decorator(login_auth)
def get(self, request, username):
return render(request, 'home.html', {'username': username})
pass
def post(self, requeest, username):
pass
六、什么是中间件
- 中间件是一个用来处理Django的请求和响应的框架级别的钩子,本质上是一个自定义类
- 可以全局范围内在视图函数执行前和施行后做一些额外的操作,比如用户登录校验、用户访问频率校验、用户权限校验
- Django中默认有七个中间件
# settings.py文件
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',
]
七、自定义中间件
- 中间件可以定义五个方法
- 方法中参数request:必需参数,和视图函数中request一样
- 方法中返回值为None时, 继续按照django定义的规则向后继续执行
- 方法中返回值为HttpResponse对象时, 则直接将该对象返回给用户
# 在settings.py的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.mymidd.MyMidd1', # 自定义中间件MD1
'app01.mymiddleware.mymidd.MyMidd2' # 自定义中间件MD2
]
7.1 process_request
- 默认按照自上而下的顺序执行MIDDLEWARE中每一个中间件内部的process_request方法
- 返回HttpResponse对象:请求会立刻停止从当前中间件的process_response 方法原路返回
# app01/mymiddleware/mymidd.py
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self, request):
print("MD1里面的 process_request")
class MD2(MiddlewareMixin):
def process_request(self, request):
print("MD2里面的 process_request")
pass
7.2 process_response
- 在视图函数之后 ,默认按照自下而上的顺序执行每个中间件中的process_response 方法
- 必须给方法传入两个形参,request和response
- 必须返回response:response是视图函数返回的HttpResponse对象 ,浏览器才能接受HttpResponse对象
# app01/mymiddleware/mymidd.py
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self, request):
print("MD1里面的 process_request")
def process_response(self, request, response):
print("MD1里面的 process_response")
return response
class MD2(MiddlewareMixin):
def process_request(self, request):
print("MD2里面的 process_request")
pass
def process_response(self, request, response):
print("MD2里面的 process_response")
return response
7.3 process_view
- 执行视图函数之前触发(路由匹配之后)
- 返回 HttpResponse对象 : 直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器
- 该方法有四个参数
- request: HttpRequest对象
- view_func:Django即将使用的视图函数对象
- view_args:将传递给视图的位置参数的列表.
- view_kwargs是将传递给视图的关键字参数的字典 (不包括request)
# app01/mymiddleware/mymidd.py
from django.utils.deprecation import MiddlewareMixin
class MD1(MiddlewareMixin):
def process_request(self, request):
print("MD1里面的 process_request")
def process_response(self, request, response):
print("MD1里面的 process_response")
return response
def process_view(self, request, view_func, view_args, view_kwargs):
print("-" * 80)
print("MD1 中的process_view")
print(view_func, view_func.__name__)
class MD2(MiddlewareMixin):
def process_request(self, request):
print("MD2里面的 process_request")
pass
def process_response(self, request, response):
print("MD2里面的 process_response")
return response
def process_view(self, request, view_func, view_args, view_kwargs):
print("-" * 80)
print("MD2 中的process_view")
print(view_func, view_func.__name__)
7.4 process_exception
- 视图函数出现错误异常自动触发,按照从下往上的顺序执行
- 两个参数 request 和 exception ( 视图函数异常产生的Exception对象 )
- 返回 HttpResponse对象 : 调用模板和中间件中的process_response方法,并返回给浏览器 (不会再执行process_exception 方法)
7.5 process_template_response
- 视图函数执行完成后, 视图函数返回的对象有一个render()方法时才会执行,倒序执行
- 两个参数 request 和 response ,即必须返回response
7.6 中间件执行流程
- 请求到达中间件, 先按照正序执行每个中间件的process_request方法 ,执行完后匹配路由
- 再顺序执行中间件中的process_view方法 ,执行完后执行视图函数
- 如果视图函数中有异常,会倒序执行process_exception
- 如果视图函数中返回对象有一个render()方法,会倒序执行process_exception方法
- 否则,会倒序执行process_response 方法,将响应发给客户端
- 方法中有response参数的必须返回response(process_template_response、process_response )
- 方法中没有response参数的(process_view、process_exception、process_response )
- 返回none:正常执行
- 返回HttpResponse的:会从当前中间件的response方法依次倒序执行,最终发送给客户端
以上,process_request、process_view默认为顺序,process_exception、process_exception、process_response 默认为倒序
cookie与session django中间件的更多相关文章
- cookie和session django中间件
目录 一.cookie和session 1. 为什么要有cookie和session 二.cookie 1. 什么是cookie 2. django中关于cookie的使用 (1)后端设置cookie ...
- 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的信息是存放在浏览 ...
随机推荐
- 2C 还是 2B,跟找工作有什么关系?
通常,我们会把公司的业务类型分成以下几种: 2C,to Customer,指面向个人客户的业务,即将公司的产品或服务销售给个人,通常做出购买决策的个人也是使用产品或服务的用户.举例说明,像 BAT 发 ...
- python3 之 内置函数enumerate
python3 内置函数enumerate一.简介: 该函数在字面上是枚举.列举的意思,用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列, 同时列出数据和数据下标,一般用在 for ...
- es3设置属性不能修改
/*es3*/ { var Person =function () { var data ={ name:'zs', sex:'男', age:18 } this.get=function (key) ...
- 原创001 | 搭上SpringBoot自动注入源码分析专车
前言 如果这是你第二次看到师长的文章,说明你在觊觎我的美色!O(∩_∩)O哈哈~ 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 本系列为SpringBoot深度源码专车系列,第一篇发车 ...
- Java基础IO类之字符串流(查字符串中的单词数量)与管道流
一.字符串流 定义:字符串流(StringReader),以一个字符为数据源,来构造一个字符流. 作用:在Web开发中,我们经常要从服务器上获取数据,数据返回的格式通常一个字符串(XML.JSON), ...
- C++ 关键字之override
非原创,转载自stackoverflow 确切的说override并非一个keyword The override keyword serves two purposes: It shows the ...
- IO到NIO的一个转变
本内容来源:Jack视频讲解和自己的一个理解. 1.故事还得从网络模型或者IO开始聊起 2.你有想过传统IO真正存在的问题吗? 3.如果你是设计者,IO可以怎样改进? 4.NIO原理分析以及代码实现 ...
- 创建raid5(3个raid2个备份)
创建raid5(3个raid2个备份) 1.首先创建五个磁盘 2.创建RAID5并设置2块备份故障盘: 3.可查看下阵列的详细信息(Spare Devices数量为1): 4.将磁盘阵列格式化为ext ...
- CentOS下永久修改主机名
永久修改主机名 [root@centos7 ~]# vim /etc/hostname 打开之后将原来的名字改成你想换的名字 [root@centos7 ~]# cat /etc/hostname 查 ...
- yarn 与 npm 比较
一.首先需要了解的命令 npm install === yarn —— install 安装是默认行为. npm install taco --save === yarn add taco —— ta ...