十一.Django的中间件 2021-03-18

十一.Django的中间件(MiddleWare)

1.什么是中间件

Django中间件(Middleware)是一个轻量级、底层的“插件”系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.

django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法

在django项目的settings模块中,有一个 MIDDLEWARE_CLASSES 变量,其中每一个元素就是一个中间件:如下

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',
]
  • class  SecurityMiddleware -->为请求/响应循环提供了几种安全改进
  • class  SessionMiddleware -->开启会话支持
  • class  CommonMiddleware -->基于APPEND_SLASH和PREPEND_WWW的设置来重写URL

       如果APPEND_SLASH设为True,并且初始URL 没有以斜线结尾以及在URLconf 中没找到对应定义,这时形成一个斜线结尾的新URL

       如果PREPEND_WWW设为True,前面缺少 "www."的url将会被重定向到相同但是以一个"www."开头的url

  • class  CsrfViewMiddleware -->添加跨站点请求伪造的保护,通过向POST表单添加一个隐藏的表单字段,并检查请求中是否有正确的值
  • class  AuthenticationMiddleware -->向每个接收到的user对象添加HttpRequest属性,表示当前登录的用户
  • class  MessageMiddleware -->开启基于Cookie和会话的消息支持
  • class  XFrameOptionsMiddleware -->对点击劫持的保护

2.中间件的运行顺序

MIDDLEWARE中的顺序很重要,因为中间件可以依赖于其他中间件
在请求阶段,在调用视图之前,Django以MIDDLEWARE(自上而下,从左自右)定义的顺序应用中间件

在处理响应期间,中间件的执行顺序是倒序执行的

2.1 在中间件中的5种方法

中间件中可以定义5个方法,分别是:

1. process_request(self,request) :

执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象

返回值是None的话,按正常流程继续走,交给下一个中间件处理或路由系统处理;如果是HttpResponse对象,Django将不执行视图函数,而该HttpResponse对象会经过本层process_response返回给浏览器

2. process_view(self, request, callback, callback_args, callback_kwargs):

在Django调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象

如果返回None,Django 将会继续处理这个请求,执行其它的process_view() 中间件,然后调用对应的视图。 如果它返回一个HttpResponse对象,Django不会调用相应的视图;HttpResponse会经由本层及本层外层的响应中间件返回给浏览器

3. process_template_response(self,request,response):

在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象

这个方法必须返回一个实现了render方法的响应对象

4. process_exception(self, request, exception)

当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象

process_exception()应该返回一个 None 或者一个HttpResponse对象。 如果它返回一个HttpResponse对象,则将应用模板响应和响应中间件,并将生成的响应返回给浏览器。 否则,默认的异常处理开始工作。

5. process_response(self, request, response)

所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象

3.自定义中间件

3.1自定义中间件的例子

1.在主目录下创建了一个e.py的文件.

2.在.py的文件中创建一个MyException的类

3.自定义时你想要加在哪一块加功能就定义相对于的方法,不用全部都定义

3.2 自定义中间件的例子2

1.在.py的文件中创建一个UserMiddleware的类

2.这个例子是给request请求增加一个myuser的属性.

3.以这一句为分界,分别在view之前执行和view之后执行

3.3 进行中间件注册(对例子)

mysite是项目名,先找到文件所在的位置,把自定义的中间件的类添加到MIDLEWARE的列表当中.

4.Django的工作流程

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值