Django中间件的使用

中间件(middleware)

中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应可以通过中间件,也就是说中间件可以处理request和response。

Django默认的中间件

在settings中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',
]

上面的配置中的中间件是有顺序的,从上到下依次通过,我们自定义的中间件如果使用的话也要按照正确的顺序添加到这里

中间件中的方法

中间件中有5个方法可以定义:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

process_request

  • 客户端发来请求与路由匹配执行之前执行
  • 返回值是None时,继续向后执行下一个中间件的process_request或路由映射
  • 返回值是HttpResponse对象时,不执行路由与views函数,直接执行该中间件与其之前的process_response,倒序执行

process_view

  • 在执行完所有中间件的process_request与路由映射之后,views函数执行之前执行
  • 执行顺序依然从第一个中间件到最后一个中间件
  • callback参数为执行的views函数
  • callback_args, callback_kwargs为views函数的参数
  • 返回值是None时,继续向后执行下一个中间件的process_view或views函数
  • 返回值是HttpResponse对象时,不执行views函数,直接执行所有中间件的process_response,倒序执行

process_template_response

  • 视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)时,才被执行(并不是views函数最后返回render对象)
  • 在views执行之后,process_exception执行之前执行
  • 返回值必须是response
  • 倒序执行

process_exception

  • process_exception用于捕捉views函数中的异常
  • 在process_response之前执行
  • exception是views函数中产生的异常对象
  • 返回值是None时继续正常执行
  • 返回值是HttpResponse对象:不再执行后面的process_exception方法,直接执行process_response
  • 倒序执行

process_response

  • 在response返回给客户端之前执行,也就值最后经过
  • 必须返回HttpResponse对象

这里要注意,在执行views函数之前的中间件的方法都是正常顺序执行,views执行之后的中间件的方法是倒序执行
这里借用https://www.jianshu.com/p/b6e65d59f508 里的图片

定义自己的中间件


from django.utils.deprecation import MiddlewareMixin class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print('->process_request')
def process_view(self, request, view_func, view_args, view_kwargs):
print('->view')
pass def process_exception(self, request, exception):
pass
def process_response(self, request, response):
print('->process_response')
return response
def process_template_response(self,request,response):
print('->process_template_response')
return response

其中的方法可以不完全实现,只需要实现自己需求的方法即可
定义后别忘了在settings中完成激活

Django中间件的使用的更多相关文章

  1. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  2. django 中间件

    django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的.所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式 ...

  3. day20 FORM补充(随时更新),F/Q操作,model之多对多,django中间件,缓存,信号

    python-day20 1.FROM生成select标签的数据应该来源于数据库. 2.model 操作 F/Q  (组合查询) 3.model 多对多操作. 4.中间件 :在请求到达url前先会经过 ...

  4. Django学习之七:Django 中间件

    目录 Django 中间件 自定义中间件 - - - 大体两种方式 将中间件移除 实例 中间件加载源码阅读 总结 Django 中间件 Tips: 更新日志: 2019.01.31 更新django中 ...

  5. Django中间件 及 form 实现用户登陆

    Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...

  6. Django 2.0 学习(20):Django 中间件详解

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

  7. Django中间件的5种自定义方法

    阅读目录(Content) Django中间件 自定义中间件 中间件(类)中5种方法 中间件应用场景 回到顶部(go to top) Django中间件 在http请求 到达视图函数之前   和视图函 ...

  8. Python自动化之Django中间件

    django中间件 Django请求生命周期 中间件中可以定义方法,分别是 process_request(self,request) process_view(self, request, call ...

  9. Django中间件如何处理请求

    Django中间件 在http请求 到达视图函数之前   和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. Django1.9版本以后中间件的执行流程 1. ...

随机推荐

  1. SpringMVC学习(二)———— 参数绑定

    一.参数绑定 1.1.什么是参数绑定? 客户在浏览器端会提交一些参数到服务器端,比如用户的登录等,就会传username 和 password过来,springmvc则通过参数绑定组件将请求参数的内容 ...

  2. zabbix实现QQ邮件报警通知--技术流ken

    前言 前几天搜了下网上使用zabbix邮件报警通知的文章,大多数还是使用mailx的方法,过程配置起来比较冗余繁琐,这几天想着把自己平时用到的qq邮件报警的方法分享出来供大家参考,以此减少不必要的步骤 ...

  3. 在C#中使用ZBar识别条形码

    目录: 一.识别库 二.从一张图片中提取多个条形码 三.注意事项 从博客园学了很多,本着分享的目的,希望后来者遇到类似问题时,不必重复造轮子,早点下班回家^-^. 一.识别库 目前主流的识别库主要有Z ...

  4. scala的安装及使用

    前提你的集群机器已经安装好jdk1.7.0_79.hadoop-2.7.3: 配置中使用了master01.slave01.slave02.slave03: 文中的所有操作都是在之前的文章http:/ ...

  5. ife2018 零基础学院 day 4

    第四天,背景边框列表链接和更复杂的选择器 背景,边框,列表,链接相关属性 背景 MDN 背景 W3School 背景 元素的背景是指,在元素内容.内边距和边界下层的区域. 属性 描述 backgrou ...

  6. eShopOnContainers 看微服务 ①:总体概览

    一.简介 eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用. 该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用. 其 ...

  7. C#装箱和拆箱。

    装箱:值类型-->引用类型. 拆箱:引用类型-->值类型 装箱:把值类型拷贝一份到堆里.反之拆箱. 具有父子关系 是拆装箱的条件之一. 所以: class Program { static ...

  8. 解码 id_token

    简介 id_token是一个特殊的token,在Microsoft Graph的认证和授权过程中颁发,它包含了已认证用户的一些信息.本文将介绍如何通过实例理解id_token,并且演示了如何解码. 准 ...

  9. H5 五子棋源码

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. ASP.NET资源大全-知识分享

    API 框架 NancyFx:轻量.用于构建 HTTP 基础服务的非正式(low-ceremony)框架,基于.Net 及 Mono 平台.官网 ASP.NET WebAPI:快捷创建 HTTP 服务 ...