在django中,中间件其实就是一个类,他是一个可以介入django的 requestresponse 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。

自定义中间件

自定义中间件有两种方式,使用函数定义,和使用类定义。

自定义中间件一般定义在项目目录或者‘应用目录下的 middleware.py 文件下。

函数定义

def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。 response = get_response(request) # 此处编写的代码会在每个请求处理视图之后被调用。 return response return middleware

示例

def simple_middleware(get_response):
print("django被初始化") def middleware(request):
print("请求")
response = get_response(request)
print("响应")
return response
return middleware

访问视图执行结果

django被初始化
[20/Oct/2018 09:44:54] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

类定义

class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。 def __call__(self, request):
# 此处编写的代码会在每个请求处理视图前被调用。 response = self.get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。 return response

示例

class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
print("初始化") def __call__(self, request):
print("请求") response = self.get_response(request)
print("响应") return response

访问视图执行结果

django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应

与旧版本中间件的兼容

在Django 1.10版本之前,中间件设置名为MIDDLEWARE_CLASSES,是长这样的:

class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
self.get_response = get_response def process_request(self, request):
# 此处编写的代码会在每个请求处理视图前被调用。 def process_response(self, request, response):
# 此处编写的代码会在每个请求处理视图之后被调用。 return response

示例

class Middleware(MiddlewareMixin):

    def __init__(self, get_response=None):
print("django初始化")
self.get_response = get_response def process_request(self, request):
print("请求") def process_response(self, request, response):
print("响应") return response

访问视图执行结果

django初始化
[20/Oct/2018 10:13:34] "POST /middleware HTTP/1.1" 200 12
请求
视图函数
响应
  • 参数get_response代表被访问的视图函数

中间件的执行顺序

中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。

示例

定义两个中间件

def simple_middleware(get_response):
print("django被初始化") def middleware(request):
print("请求")
response = get_response(request)
print("响应")
return response
return middleware class SimpleMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
print("初始化") def __call__(self, request):
print("请求") response = self.get_response(request)
print("响应") return response

注册顺序

MIDDLEWARE = [
'middleware.middleware.simple_middleware',
'middleware.middleware.SimpleMiddleware',

执行结果

初始化2
django被初始化1
请求1
请求2
视图函数
响应2
响应1

django中间件-12的更多相关文章

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

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

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

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

  3. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

  4. Django中间件之SessionMiddleware源码分析

    settings.py文件中 MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', ] # from djang ...

  5. django 中间件

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

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

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

  7. Django中间件的使用

    Django中间件的使用 中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应 ...

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

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

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

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

随机推荐

  1. Gson基本操作,JsonObject,JsonArray,String,JavaBean,List互转

    (转自)https://www.cnblogs.com/robbinluobo/p/7217387.html String.JsonObject.JavaBean 互相转换 User user = n ...

  2. js异步原理与 Promise

    一.Javascript的异步原理 javascript 是单线程语言,所以同一时间只执行一个运算.但有些方法是不能瞬间完成或不可预知何时完成的(如网络请求.settimeout等),为了让它们不对后 ...

  3. 浅谈Java——泛型DAO

    首先解释一下为什么要学习泛型DAO.平时在写DAO的时候是一个接口对应一个实现类,实现类里面要写很多的操作数据库的方法.当我们有很多的javaben的时候我们会写很多的接口和实现类,并且里面的代码都是 ...

  4. J2EE开发环境--RAP

    J2EE开发环境--RAP J2EE开发环境分四步: 1.JDK环境 2.tomcat 3.redis环境 4.mysql环境 5.RAP包 线上环境,推荐使用源码,自建应用用户,设置对应规则,禁止关 ...

  5. 【Oracle】存储过程写法小例子

    1.存储过程的基本语法: CREATE OR REPLACE PROCEDURE 存储过程名(param1 in type,param2 out type) IS 变量1 类型(值范围); 变量2 类 ...

  6. 简易使用UILabel的富文本

    简易使用UILabel的富文本 使用效果: 源码: NSString+YX.h    NSString+YX.m // // NSString+YX.h // YXKit // // Copyrigh ...

  7. MagicalRecord使用中的注意事项

    MagicalRecord使用中的注意事项 使用CoreData [1] 使用CoreData [2] 使用CoreData [3] 使用CoreData [4] 使用MagicalRecord操作C ...

  8. 有序字典(OrderedDict)、默认字典(defaultdict)内置函数

    http://www.cnblogs.com/wupeiqi/articles/5115190.html import collections do = collections.OrderedDict ...

  9. [转]CentOS7增加或修改SSH端口号

    前言:开启某服务或软件的端口,要从该服务或软件监听的端口(多以修改配置文件为主),SeLinux和防火墙(FireWall)的安全策略下手.如果使用阿里云,腾讯等第三方服务器还需要对管理控制台的安全组 ...

  10. 解决Oracle11g密码180天过期,账号锁住的问题

    1.查看用户的proifle是哪个,一般是default: sql>SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的密码 ...