[TOC]
在django中,中间件其实就是一个类,他是一个可以介入django的 `request` 和 `response` 的钩子框架,在请求响应不同的阶段,执行类中不同的代码,用于在全局修改django的输入输出。
## 自定义中间件
自定义中间件有两种方式,使用函数定义,和使用类定义。
自定义中间件一般定义在项目目录或者‘应用目录下的 `middleware.py` 文件下。
### 函数定义
```python
def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
```
示例
```python
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
请求
视图函数
响应
```
### 类定义
```python
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
```
示例
```python
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,是长这样的:
```python
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
```
示例
```python
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代表被访问的视图函数
## 中间件的执行顺序
中间件的执行顺序和注册顺序有关系。在视图函数处理前,会按注册顺序从上往下执行。在属兔函数处理后,会按注册顺序从上往下执行, 在初始化的时候,也是从下往上执行。
![](https://box.kancloud.cn/b12280686a5e2400f977232640b7c17c_880x169.png)
示例
定义两个中间件
```python
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
```
注册顺序
```python
MIDDLEWARE = [
'middleware.middleware.simple_middleware',
'middleware.middleware.SimpleMiddleware',
```
执行结果
```
初始化2
django被初始化1
请求1
请求2
视图函数
响应2
响应1
```
- 1.介绍
- 2.工程搭建
- 2.1.环境配置
- 2.2.创建工程
- 2.3.创建子应用
- 2.3.1.pycharm打开项目
- 2.4.创建视图
- 3.基本配置
- 3.1.settings基本配置项
- 3.2.路由配置
- 4.请求响应
- 4.1.request
- 4.2.response
- 4.3.cookie
- 4.4.session
- 5.类视图中间件
- 5.1.类视图
- 5.2中间件
- 6.数据库
- 6.1.数据库配置
- 6.2定义模型类
- 6.3数据库迁移
- 6.4数据库操作
- 6.5查询集
- 6.6模型管理器
- 7.模板表单
- 7.1使用模板
- 7.2模板标签
- 7.3表单
- 8.后台管理
- 8.1Admin
- 8.2自定义模型类样式
- 8.3列表页