cookie和session、Django中间件

1|0cookie和session、Django中间件

1|0cookie和session简介
http的五大特性: 1.基于请求响应 2.基于tcp和ip作用于应用层之上的协议 3.无状态 服务端无法识别客户端的状态 (互联网刚开始兴起的的时候 所有人访问网址都是一样的数据,服务端记不住客户端的状态,服务端不得不想办法记住客户端的状态 cookie与session应运而生) 4.无连接 (每次请求都要通过三次握手四次挥手来重新建立连接)
''' cookie就是保存在客户端,与用户状态相关的信息 session就是保存在服务端,与用户状态相关的信息 session的工作需要依赖cookie '''
我们都知道HTTP协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况; '''人生只如初见''',对服务器来说,每次请求都是全新的; 状态可以理解为客户端和服务端在某次会话中产生的数据,那无状态的就以为这些数据不会被保留,会话中产生的数据又是我们需要保存的,也就是说要'保持状态',因此cookie就是在这样一个场景下诞生。

1|1cookie(保存在客户端上跟用户信息(状态)相关的数据)

cookie是指一段小信息,它是服务端发送出来存储在浏览器上的一组组键值对,下次访问时浏览器自动携带这些键值对,以便提取有用信息。
cookie的用处: 1.会话状态管理 2.个性化设置 3.浏览器行为跟踪

1|2session(保存在服务端上跟用户信息(状态)相关的数据)

Session代表着服务器和客户端一次会话的过程。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者超时Session超时失效时会话结束。

1|3django操作session

由于session是保存在服务端上面的数据 就应该有个地方能够存储 Django默认session失效时间是14
设置session request.session['key'] = value 1.生成一个随机字符串 2.对value数据做加密处理 并在django_session表中存储 随机字符串>>>加密数据 3.将随机字符串也发送一份给客户端保存(cookie) sessionid:随机字符串 获取session request.session.get('key') 1.自动获取随机字符串 2.去django_session表中根据随机字符串获取加密的数据 3.自动解密数据并处理到request.sesion.get()中 补充说明 1.可以设置过期时间 2.存储session数据的位置也可以修改
当客户端登录成功之后,然后服务端会产生一个随机字符串返回给客户端保存,并且服务端争对这些随机字符串会对用户数据做对应关系,然后做一个保存,将这些数据保存到服务端,然后存到表中,django在执行数据库迁移命令的时候,会自动创建好多好多张不是我们添加进去的表,这些表中就有django_session表,这张表就是专门用来存储session相关服务端的数据,因此想要执行session,必须先执行迁移命令 1.django默认的session失效时间142.客户端会接收到键值对 键默认是sessionid值是加密的随机字符串(令牌)

2|0django中间件

中间件是一个用来处理Django请求和响应的框架级别的钩子,他是一个轻量级别的插件系统,用于全局范围内改变Django的输入输出,每个中间件都负责做一些特定的功能。 中间件就是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,他本身就是一个自定义类,类中定义了几个方法,Django会在请求的特定的时间去执行这些方法,由于其影响的是全局,所以要谨慎使用,使用不当会影响性能的。 django中间件类似于Django的门户,所有请求和响应走都必须经过中间件,Django默认自带七个中间件,每个中间件都有自己的功能,除了它默认的之外,还支持自定义中间件
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', ]

2|1django中间件使用场景

全局相关的功能: 全局用户身份校验,全局用户黑名单校验,全局用户访问频率校验 中间件是可以拿到ip地址的,关于黑名单校验,它会进行判断,这个ip地址的身份,如果是黑名单用户,那么就直接不让他进入后面,直接pass掉它了,那么关于访问频率的校验,先设置多长时间内访问多少次,然后中间件进行识别计算看你出现过几次

2|2定义中间件

如果想要写一些第三方的插件功能,可以在应用下创建一个文件,在这个文件下写一些py文件 1.定义中间件 from django.utils.deprecation import MiddlewareMixin class MyMdd1(MiddlewareMixin): def prcess_request(self, request): print('MyMdd1 process_request') class MyMdd2(MiddlewareMixin): def prcess_request(self, request): print('MyMdd2 process_request') 2.配置中间件

image

2|3django自定义中间件的五个方法

1.process_request:请求进来,权限认证 2.process_response:请求有响应时执行 3.process_view:路由匹配后,能够得到视图函数 4.process_template_response:模板渲染时执行 5.process_exception:异常时执行
1|01.process_request(用来做全局相关的限制工作)
1.请求来的时候会按照配置文件中注册了的中间件,从上往下依次执行每个中间件中的process_request方法,如果没有该方法,就直接跳过 2.如果该方法返回了HttpResponse对象,那么请求就不会再往后执行,而是直接原路返回(校验失败不允许访问)

image

image

1|02.process_response
1.响应走的时候会按照配置文件中注册了的中间件,从下往上依次执行每个中间件里面的process_response方法,如果没有就直接跳过 2.该方法有两个额外的参数:request,response,一般默认情况下返回response 3.该方法也可以自己返回HttpResponse对象

image

2|4总结

当前端发来请求,Django会执行每个中间件中的process_request方法,从上往下执行 响应走的时候,Django会执行每个中间件中的process_response方法,process_response是在视图函数之后执行的,执行顺序是从下往上。
1|03.process_view
当路由匹配成功之后 执行视图函数之前 自动触发 process_view(self, request, view_func, view_args, view_kwargs) 该方法有四个参数 request是HttpRequest对象 view_func是Django即将使用的视图函数。(它是实际的函数对象,而不是函数的名称作为字符串) view_args是将传递给视图的位置参数的列表. view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。 Django会在调用视图函数之前调用process_view方法。 它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器
1|04.process_excption
当视图函数报错之后 自动触发 process_exception(self, request, exception) 该方法两个参数: 一个HttpRequest对象 一个exception是视图函数异常产生的Exception对象。 这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行
1|05.process_template_response
当视图函数返回的数据对象中含有render属性对应render函数才会触发 process_template_response(self, request, response) 它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。 process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

__EOF__

本文作者泡芙有点甜
本文链接https://www.cnblogs.com/zx0524/p/17393736.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   小王应该在学习!  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示