創(chuàng)建middleware.py文件
方法一:
---> middleware.py
import json
from django.utils.deprecation import MiddlewareMixin
class ReturnUserMiddleware(MiddlewareMixin):
def process_response(self, request, response):
# 只處理自定義視圖響應, 繞開Django第三方工具不分離模式響應
if isinstance(response.data, (dict, list, str, float, int)):
response.data = {'result': response.data}
response.data['user'] = request.user.username
# content才是WSGI構建響應報文時的響應體.
response.content = json.dumps(response.data)
return response
---> settings.py
MIDDLEWARE = [
...
'utils.middleware.ReturnUserMiddleware',
]
# 添加中間件前
[
{
"id": 4,
"btitle": "射雕英雄傳",
"bpub_date": "1980-05-01",
"bread": 12,
"bcomment": 34,
"is_delete": false,
"create_time": "2020-12-03T11:26:00+08:00",
"update_time": "2020-12-03T11:26:00+08:00"
},
{
"id": 5,
"btitle": "天龍八部",
"bpub_date": "1986-07-24",
"bread": 36,
"bcomment": 40,
"is_delete": false,
"create_time": "2020-12-03T11:26:00+08:00",
"update_time": "2020-12-03T11:26:00+08:00"
}
]
# 添加中間件后
{
"result": [
{
"id": 4,
"btitle": "射雕英雄傳",
"bpub_date": "1980-05-01",
"bread": 12,
"bcomment": 34,
"is_delete": false,
"create_time": "2020-12-03T11:26:00+08:00",
"update_time": "2020-12-03T11:26:00+08:00"
},
{
"id": 5,
"btitle": "天龍八部",
"bpub_date": "1986-07-24",
"bread": 36,
"bcomment": 40,
"is_delete": false,
"create_time": "2020-12-03T11:26:00+08:00",
"update_time": "2020-12-03T11:26:00+08:00"
}
],
"user": "xiaoming"
}
方法二:
----摘自"黑馬程序員"
學習目標:
知道什么是中間件
掌握中間件的調用順序
什么是中間件:
- Django 的中間件是一個輕量級谆奥、底層的插件系統(tǒng)透硝,可以介入請求和響應處理過程,修改 Django 的輸入或輸出.
- 中間件的設計為開發(fā)者提供了一種無侵入式的開發(fā)方式喳整,增強了 Django 框架的健壯性坞生。
- 我們可以使用中間件,在 Django 視圖的不同階段對輸入或輸出進行處理.
中間件的定義方法
定義一個中間件工廠函數(shù)责嚷,然后返回一個可以被調用的中間件痕支。
中間件工廠函數(shù)需要接收一個可以調用的 get_response 對象。
返回的中間件也是一個可以被調用的對象芒澜,并且像視圖一樣需要接收一個 request 對象參數(shù)仰剿,返回一個 response 對象。
def simple_middleware(get_response):
# 此處編寫的代碼僅在 Django 第一次配置和初始化的時候執(zhí)行一次痴晦。
def middleware(request):
# 此處編寫的代碼會在每個請求處理視圖前被調用酥馍。
response = get_response(request)
# 此處編寫的代碼會在每個請求處理視圖之后被調用。
return response
return middleware
例如阅酪,在 users 應用中新建一個 middleware.py 文件旨袒,
def my_middleware(get_response):
print('init 被調用')
def middleware(request):
print('before request 被調用')
response = get_response(request)
print('after response 被調用')
return response
return middleware
定義好中間件后,需要在 settings.py 文件中添加注冊中間件
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',
# 添加中間件
'users.middleware.my_middleware',
]
定義一個視圖進行測試
def demo_view(request):
print('view 視圖被調用')
return HttpResponse('OK')
執(zhí)行結果
注意:Django 運行在調試模式下术辐,中間件 init 部分有可能被調用兩次砚尽。
多個中間件的執(zhí)行順序
- 在請求視圖被處理前,中間件由上至下依次執(zhí)行
- 在請求視圖被處理后辉词,中間件由下至上依次執(zhí)行
示例:
定義兩個中間件
def my_middleware(get_response):
print('init 被調用')
def middleware(request):
print('before request 被調用')
response = get_response(request)
print('after response 被調用')
return response
return middleware
def my_middleware2(get_response):
print('init2 被調用')
def middleware(request):
print('before request 2 被調用')
response = get_response(request)
print('after response 2 被調用')
return response
return middleware
注冊添加兩個中間件
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',
'users.middleware.my_middleware', # 添加
'users.middleware.my_middleware2', # 添加
]
執(zhí)行結果
init2 被調用
init 被調用
before request 被調用
before request 2 被調用
view 視圖被調用
after response 2 被調用
after response 被調用
視圖前后的執(zhí)行流程
總結:
- 中間件一般會現(xiàn)在一個單獨的文件之中
- 中間件函數(shù)定義好后, 可以獲取三個空間用于添加代碼
- 項目初始化的時候會調用的空間
- 在調用視圖函數(shù)之前會調用的空間
- 在調用視圖函數(shù)之后會調用的空間
- 使用中間件之前需要在 settings.py 的 MIDDLEWARE 模塊中注冊.
- 中間件調用的順序需要注意.