1.django內置中間件
# 中間件顧名思義,是介于request與response處理之間的一道處理程序,相對比較輕量級,并且在全域上改變django的輸入與輸出,因為改變的是全域,所以需要謹慎實用,用不好會影響到性能 # django內置中間件 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',#注釋之后就拿不到request.session了 'django.middleware.common.CommonMiddleware',#重定向 'django.middleware.csrf.CsrfViewMiddleware',#注釋之后發post請求會被禁止 'django.contrib.auth.middleware.AuthenticationMiddleware',#如果'django.contrib.sessions.middleware.SessionMiddleware'注釋了,那這個也要注釋,不然會報錯 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
2.自定義中間件
1 自定義步驟: -寫一個類,繼承MiddlewareMixin -里面寫方法process_request(請求來了,一定會觸發它的執行) -在setting中配置(注意,放在前和放在后) MIDDLEWARE = [ ... 'app01.mymiddle.MyMiddleware1', ... ]
3.自定義中間件 代碼
#settings.py 略 #urls.py 略 #mymiddle.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了') return response #views.py from django.shortcuts import render,HttpResponse,redirect def index(request): print('我是視圖函式') return HttpResponse('ok')
4.中間件需要知道的用法
process_request,process_response,process_view,process_exception

1 process_request(request物件) 2 process_response(request物件,response物件) ''' 如這個網址:127.0.0.1/user/... 加cookie name=lili 利用process_request 和process_response 因為已經有request物件了,先用request.get_full_path()取到所有路徑, 判斷路徑如果是127.0.0.1/user/...就加上cookie,用reponse.set_cookie('name','lili')不是就不做處理 ''' 3 多個中間件,執行順序是什么?(!!!記得寫好中間件) -請求來的時候從上往下執行:process_request -請求走的時候,從下往上執行:process_response 4 process_request可以干什么? -寫一個中間件,不管前端用什么編碼,在requset.data中都有post的資料 -頻率限制(限制某個ip地址,一分鐘只能訪問5次) -登錄認證(只要沒登錄,重定向到login路徑)、 -記錄用戶訪問日志(ip,時間,訪問路徑) 5 process_response可以干什么?內部有response物件 -統一給所有(某幾個路徑)加cookie -統一給所有(某幾個路徑)加回應頭 6 process_view 路由匹配成功和視圖函式執行之前執行(callback就是視圖函式) def process_view(self, request, callback, callback_args, callback_kwargs): # print(callback) # print(callback_args) # print(callback_kwargs) # res=callback(request) # print("中間件1的process_view") return res 7 process_exception 視圖函式出錯,會執行它(全域例外捕獲)(可以記錄日志,哪個ip地址,訪問哪個路徑出的錯,利用request物件) # 全域例外捕獲,回傳4開頭的 def process_exception(self, request, exception): print(exception) return render(request,'error.html') 8 process_template_response(self,request,response) 該方法對視圖函式的回傳值有要求,必須是一個含有render方法類的物件,才會執行此方法
5.用法中3的代碼

#urls.py urlpatterns = [ path('', views.index), ] #index.html 創建一個index.html就行 #settings.py MIDDLEWARE = [ ... 'app01.mymiddle.MyMiddleware1', 'app01.mymiddle.MyMiddleware2', ... ] #mymiddle.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了1') # print(request.session) # 可不可以回傳?必須回傳HttpResponse的物件 # return HttpResponse('我不讓你訪問') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了1') return response #必須回傳 class MyMiddleware2(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了2') # print(request.session) # 可不可以回傳?可以回傳,但是視圖函式就不走了 # return HttpResponse('dsb') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了2') return response #views.py from django.shortcuts import HttpResponse def index(request): print('我是視圖函式') return HttpResponse('ok')
6.用法中6的代碼

from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了1') # print(request.session) # 可不可以回傳?必須回傳HttpResponse的物件 # return HttpResponse('我不讓你訪問') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了1') return response # 路由匹配成功,視圖函式執行之前執行 def process_view(self, request, callback, callback_args, callback_kwargs): # print(callback) #指的就是視圖函式 # print(callback_args) #() # print(callback_kwargs)#{} #相當于視圖函式裝飾器 res=callback(request) return res ,寫上它,執行順序會變,會先執行視圖函式,再執行,不加它先執行這里再 執行 視圖函式 # res=callback(request) # print("中間件1的process_view") # return res class MyMiddleware2(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了2') # print(request.session) # 可不可以回傳? # return HttpResponse('dsb') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了2') return response ''' 執行順序: 請求來了1 請求來了2 中間件1的process_view 我是視圖函式 請求走了2 請求走了1 加上call_back 執行順序: 請求來了1 請求來了2 我是視圖函式 中間件1的process_view 請求走了2 請求走了1 '''
7.用法中7的代碼

#views.py from django.shortcuts import render, HttpResponse, redirect def index(request): print('我是視圖函式') a return HttpResponse('ok') #error.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 404 </body> </html> #mymiddle.py from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render,HttpResponse class MyMiddleware1(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了1') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了1') return response # 路由匹配成功,視圖函式執行之前執行 def process_view(self, request, callback, callback_args, callback_kwargs): print("中間件1的process_view") class MyMiddleware2(MiddlewareMixin): # 所有的請求來了,都會走到它 def process_request(self,request): # request就是當請求的request物件 print('請求來了2') # 所有的請求走了,都會執行它 def process_response(self, request, response): print('請求走了2') return response # 全域例外捕獲,回傳4開頭的報錯資訊(可以讓用戶覺得自己錯誤,而不是服務器內部錯誤) def process_exception(self, request, exception): print(exception) # name 'a' is not defined print('exception') #exception return render(request,'error.html') ''' 執行順序: 請求來了1 請求來了2 中間件1的process_view 我是視圖函式 name 'a' is not defined exception 請求走了2 請求走了1 '''
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/188325.html
標籤:架構設計
上一篇:2020年淘寶超級星秀貓js腳本
