首页 > 其他分享 >cookie和session、Django中间件

cookie和session、Django中间件

时间:2023-05-12 12:22:32浏览次数:59  
标签:process request 中间件 视图 django session cookie

cookie和session、Django中间件

cookie和session简介
http的五大特性:
1.基于请求响应
2.基于tcp和ip作用于应用层之上的协议
3.无状态
	服务端无法识别客户端的状态
    (互联网刚开始兴起的的时候 所有人访问网址都是一样的数据,服务端记不住客户端的状态,服务端不得不想办法记住客户端的状态
				cookie与session应运而生)
4.无连接
	(每次请求都要通过三次握手四次挥手来重新建立连接)
'''
cookie就是保存在客户端,与用户状态相关的信息

session就是保存在服务端,与用户状态相关的信息

session的工作需要依赖cookie
'''
我们都知道HTTP协议是无状态的,无状态的意思就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况;
'''人生只如初见''',对服务器来说,每次请求都是全新的;
状态可以理解为客户端和服务端在某次会话中产生的数据,那无状态的就以为这些数据不会被保留,会话中产生的数据又是我们需要保存的,也就是说要'保持状态',因此cookie就是在这样一个场景下诞生。

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

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

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

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

django操作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失效时间14天
2.客户端会接收到键值对 键默认是sessionid值是加密的随机字符串(令牌)

django中间件

中间件是一个用来处理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',
]

django中间件使用场景

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

定义中间件

如果想要写一些第三方的插件功能,可以在应用下创建一个文件,在这个文件下写一些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

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

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

image

image

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

image

总结

当前端发来请求,Django会执行每个中间件中的process_request方法,从上往下执行
响应走的时候,Django会执行每个中间件中的process_response方法,process_response是在视图函数之后执行的,执行顺序是从下往上。
3.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方法,最后返回给浏览器

4.process_excption
当视图函数报错之后 自动触发

process_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行

5.process_template_response
当视图函数返回的数据对象中含有render属性对应render函数才会触发

process_template_response(self, request, response)
它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。
process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

标签:process,request,中间件,视图,django,session,cookie
From: https://www.cnblogs.com/zx0524/p/17393736.html

相关文章

  • vue 存储cookie 与使用
    安装cookie依赖包npmi@vueuse/integrations安装cookienpmiuniversal-cookie使用cookieimport{useCookies}from"@vueuse/integrations/useCookies"constcookie=useCookies();存取cookiecookie.set("token","123456789")获取cookiecookie.......
  • vue项目中封装localStorage和sessionStorage
    1.为什么需要封装localStorage和sessionStorage?因为封装localStorage和sessionStorage可以提高程序的维护性、可重用性和扩展性,同时也可以使代码更为简单、易懂。2.以下是一个简单的代码封装示例可以新建一个utils目录文件,在该文件下新建storage.js文件进行封装//封装local......
  • F. Madoka and The First Session
    F.MadokaandTheFirstSession/*首先是对权值进行处理,把每次操作都看成一个减去2就可以了这样就只需要对大家都减去一个1,最后如果有奇数或者大于0,那就一定不可以然后就是见图,对边进行建图,代表这条边只能跑一次对si=1的直接建立边就可以了si=0的需要建立中转点,因为要限制......
  • cookie session token 发展史(便于理解jwt)
    目录一、cookiesessiontoken发展史(彻底理解cookie,session,token,便于理解jwt)1、Cookie,Session,Token发展史2、Cookie,Session解释2.1Cookie2.2Session2.3cookie和session的区别3、Token介绍3.1传统方式——基于服务器的验证3.2基于服务器验证方式的问题3.2.1Seesions3.2.2......
  • AWS 中的另外一种远程工具 AWS Session Manager
    >作者:[SRE运维博客](https://www.cnsre.cn/)>博客地址:[https://www.cnsre.cn/](https://www.cnsre.cn/)>文章地址:[https://www.cnsre.cn/posts/230129126154/](https://www.cnsre.cn/posts/230129126154/)>相关话题:[https://www.cnsre.cn/tags/aws/](https://www.cnsre.......
  • Centos环境下部分中间件“rabbitmq、rocketmq、clickhouse”部署
    部分中间件部署目录部分中间件部署docker部署rabbitmqdocker部署rocketmq单机部署clickhousedocker部署rabbitmq#拉镜像dockerpullrabbitmq:3.8-management#启动dockerrun\-eRABBITMQ_DEFAULT_USER=guest\-eRABBITMQ_DEFAULT_PASS=guest\-v/data/rabbitmq/ra......
  • Pytest - xdist 保证多进程共享 session 级别fixture
    背景:搜索自动化不同的测试文件件需要使用相同的变量解决:importloggingfromtoolsimportset_loggingimportpytestimporttimefromfilelockimportFileLockimportjsonimportosset_logging.set_test_log()@pytest.fixture(scope="session")defget_batch_i......
  • Cookie
        ......
  • Django高级之-中间件
    目录一什么是中间件二中间件有什么用七个中间件中间件中的方法三自定义中间件process_request和process_responseprocess_viewprocess_exceptionprocess_template_response四中间件应用场景1、做IP访问频率限制2、URL访问过滤五CSRF_TOKEN跨站请求伪造背景信息form表单中如何......
  • Failed to open connection to "session" message bus: Using X11 for dbus-daemon au
    Failedtoopenconnectionto"session"messagebus:UsingX11fordbus-daemonautolaunchwasdisabledatcompiletime,setyourDBUS_SESSION_BUS_ADDRESSinstead4Failedtoopenconnectionto"session"messagebus:UsingX11fordbus-da......