[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代表被訪問的視圖函數
## 中間件的執行順序
中間件的執行順序和注冊順序有關系。在視圖函數處理前,會按注冊順序從上往下執行。在屬兔函數處理后,會按注冊順序從上往下執行, 在初始化的時候,也是從下往上執行。

示例
定義兩個中間件
```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列表頁