Django中间件middleware本质是一个类,在请求到返回的中间,类中不同的方法会在指定的时机中被触发。setting.py的变量MIDDLEWARE_CLASSES中的每一个元素都是中间件,且这些注册的中间件之间,有着严格的执行顺序。在request到url层之间,中间件的执行顺序是从上而下,依次执行。在response到浏览器之间,中间的执行顺序变成从下至上。

通常情况下,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',
]

中间件的执行顺序如下图所示:

写中间件类的定义五种方法如下,它们分别代表着各自不同的执行时机。

  • process_request(self,request):执行视图前被调用,返回None或HttpResponse对象
  • process_view(self,request,callback,callback_args,callback_kwargs):调用视图函数之前被执行,返回None或HttpResponse

上面两个方法是在请求到视图之间可以被执行的方法,若其中任意一个返回的HttpResponse,那么这个请求就不会到达视图层,而是直接返回给浏览器。

  • process_template_response(self,request,response):视图函数渲染模板后立即被调用。
  • process_exception(self,request,exception):在视图函数抛出异常时被调用,返回一个HttpResponse对象。
  • process_response(self,request,response):所有响应返回到浏览器之前被调用,返回一个HttpResponse对象。

以上三个方法都是发生在response到客户端之间。

自定义中间件

自定义中间件要导入from django.utils.deprecation import MiddlewareMixin,下面写的类都是基于MiddlewareMixin来写。自定义的中间件写好后要记得在setting中进行注册。中间件的作用范围是整个项目下的所有主路由及其子路由(各个app)。

自定义中间件的第一种方式:

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse class Usermiddle(MiddlewareMixin):
def process_request(self,request):
print('这是方法1')
return None
def process_view(self,request,callback,callback_args,callback_kwargs):
print('这是方法2')
return None
def process_template_response(self,request,response):
print('渲染模板后执行')
return response
def process_exception(self,request,exception):
print('视图函数抛出异常')
return HttpResponse(exception)
def process_response(self,request,response):
print('这是方法5')
return response

自定义中间件的第二种方式:

class Usermiddle1(object):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self, request):
#从这开始是请求到视图前执行的语句
print('xxx') #从这结束请求到视图前执行的语句
response = self.get_response(request)
# 从这开始是response到浏览器前执行的语句
print('xxx') # 从这结束response到浏览器前执行的语句
return response

注册这两个类:

Django2.0——中间件的更多相关文章

  1. 《玩转Django2.0》读书笔记-Django配置信息

    <玩转Django2.0>读书笔记-Django配置信息 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 项目配置是根据实际开发需求从而对整个Web框架编写相应配置信息. ...

  2. Django2.0.1开发框架搭建

    1.使用vs2017创建空白django项目 2.右键python环境的env---安装python包  升级django到2.0.1和setuptools到38.4.0版本,具体环境如下: 3.配置 ...

  3. Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

    Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项 参考:https://blog.csdn.net/weixin_40475396/article/detail ...

  4. django2.0+linux服务器 ,如何让自己电脑访问

    这几天一直在搞这个服务器端口开放问题,来让自己电脑可以访问服务器下的django网页,今天终于弄好了~~~~~离成功又进了一步~~~~~ 1.首先,我们来开放一个linux服务器的端口(我开放了828 ...

  5. Django2.0中文文档

    title: Django2.0中文文档 tags: Python,Django,入沐三分 grammar_cjkRuby: true --- Django2.0版本已经发布了,我们先来看一个图片 从 ...

  6. python3下Django2.0配置最新xadmin详解

    1,打开pycharm,创建一个Django项目 2,安装Django,默认是最新版本,pip3 install -i https://pypi.douban.com/simple/ django 3 ...

  7. 【Python3.6+Django2.0+Xadmin2.0系列教程一】环境搭建及项目创建

    由于工作需要,接触了大半年时间的Django+xadmin框架,一直没空对这块对进行相关的梳理.最近在同事的怂恿下,就在这分享下笔者的学习及工作经验吧. 好了,话不多说,下面开始进入正题: 环境需求: ...

  8. Django:Python3.6.2+Django2.0配置MySQL

    持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...

  9. Django2.0版本 path与Django1.x版本url正则匹配问题

    Django1.x版本url正则匹配如下: Django2.0版本正则匹配则要导入re_path模块如下:

随机推荐

  1. Golang的循环结构-for语句

    Golang的循环结构-for语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环语法 循环结构在生活中的场景也非常的多,比如: ()上班族们每天朝九晚五的生活; ( ...

  2. linux下anaconda的安装和使用

    1.将python3设置为默认 直接执行这两个命令即可: sudo update-alternatives --install /usr/bin/python python /usr/bin/pyth ...

  3. Meeloun教你如何正式切入Essay写作话题

    很多同学在Essay写作过程中会发现:如果题目问到解决办法,写来写去,都是政府要颁布政策,人们要提高意识,感觉一点新意也没有.怎么样更好地切合不同的话题,想到最合适的解决办法呢?今天小编为你奉上更多处 ...

  4. spring boot集成mybatis(1)

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  5. POJ 2481:Cows 树状数组

    Cows Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14906   Accepted: 4941 Description ...

  6. Spring(5) -(14) pointcut 语法

    AOP的规范本应该由SUM公司提出,但是被AOP联盟捷足先登.AOP联盟指定AOP规范,首先就要解决一个问题,怎么表示切入点,也就是在哪些方法上增强(where) AspectJ 是一个面向切面的框架 ...

  7. 欧拉回路--P2731 骑马修栅栏 Riding the Fences

    实在懒得复制题干了 *传送 1.定义 *如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路. *如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路. *具有欧拉回路 ...

  8. Upgrade to 17.1 from 17.0 problem:UnicodeEncodeError: 'ascii' codec can't encode character '\xc4' in position 50: ordinal not in range(128)

    最近 gentoo 从 17.0 更新到 17.1, 需要手动进行升级配置,使用 unsymlink-lib -p --finish 这一步的时候报错,报错如下: /usr/lib/python-ex ...

  9. 浪潮服务器raid5-echo转义说明

    https://jingyan.baidu.com/article/4ae03de3e4c8d33eff9e6bee.html https://wenku.baidu.com/view/3c5dc9a ...

  10. Android自定义View——实现字母导航栏

    1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...