Django中的中间件(含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',
]

Django请求的一个生命周期图1

Django请求的一个生命周期图2

可以看出当一个请求来时,会依次执行每一个中间件中的process_request函数,再通过路由找到对应的视图函数执行,求情完成后,会再一次经过每一个中间件的process_response函数,再返回给浏览器

因此我们如果有一些操作是需要在执行每个views视图函数之前就要执行的可以添加中间件进行执行(如登录验证)

中间件与装饰器的选择

以后想要对所有的请求做统一操作时,用中间件

只是对少量的视图函数做操作时,用装饰器

中间件的写法

首先在项目内任意创建一个目录,在目录下创建一个py文件,名字随意

在该py文件中写中间件的类,这个类需要继承MiddlewareMixin(在1.7或1.8等老版本django中只需要继承object类即可)

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect class AuthMiddleware(MiddlewareMixin):
def process_request(self,request):
# 如果么有返回值;返回None,表示可以继续往下执行
# 如果有返回值,执行自己的response以及以上的response。 if request.path_info == '/login/':
return None user_info = request.session.get('user_info')
if not user_info:
# return HttpResponse('请登录')
return redirect('/login/') def process_response(self,request,response):
return response

在settings中配置

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',
'app01.middleware.auth.AuthMiddleware', # 中间件的路径
]

process_request和process_response的参数

process_request参数

self,request

    def process_request(self,request):
# 如果么有返回值;返回None,表示可以继续往下执行
# 如果有返回值,执行自己的response以及以上的response。 if request.path_info == '/login/':
return None user_info = request.session.get('user_info')
if not user_info:
# return HttpResponse('请登录')
return redirect('/login/')

process_response参数

self,request,response

def process_response(self,request,response):
return response

process_request和process_response的返回值

process_request返回值

当process_request函数没有返回值(默认为None)或者返回None时,请求会接着往后走,执行后面的中间件直到视图函数

当process_request函数有返回值时,请求将不会再往后走,而是直接执行该中间件的process_response函数,并接着执行前面中间的process_response函数,直至返回给浏览器

process_response返回值

必须有返回值,否则会报错,返回response

最新文章

  1. 在UWP中页面滑动导航栏置顶
  2. SQL Server 数据缓存
  3. 处理海量数据的高级排序之——希尔排序(C++)
  4. NHibernate系列文章二:创建NHibernate工程
  5. javascript中set与get方法详解
  6. python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出
  7. php 链式操作的实现 学习记录
  8. MySQL无法重启问题解决Warning: World-writable config file ‘/etc/my.cnf’ is ignored
  9. Eclipse文件覆盖问题
  10. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)
  11. Oracle 修改序列的初始值
  12. 【LaTeX排版】LaTeX使用--入门基础<一>
  13. gei 操作
  14. python 安装pip
  15. 20180518VSTO多簿单表汇总
  16. 浅谈Linux系统中如何查看进程
  17. September 04th 2017 Week 36th Monday
  18. shell if [ -d filename]
  19. C++中前置声明的应用与陷阱
  20. MyEclipse/Eclipse安装插件的几种方式

热门文章

  1. HDU 3294 Manacher模版题
  2. php-fpm 如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
  3. 文本识别OCR浅析:特征篇
  4. Could not load type ‘System.ServiceModel.Activation.HttpModule’ from&
  5. mfc小工具开发之定时闹钟之---功能介绍
  6. 微信公众号实现zaabix报警2017脚本(升级企业微信后)
  7. json 字符串 对象 互转
  8. input file reader
  9. Python相对完美的URL拼接函数
  10. String, JSONArray , JSONObject ,Map<String, Object> 与对象