>[success] # Django 中間件
~~~
所有的請求,先到中間插件過濾,過濾后進行url匹配,到對應的view方法,response返回給中間插件,中間插件層層返回給用戶。根據這個描述我們可以畫個圖
~~~

* setting 中的圖

>[success] # 如何配置
>[danger] ##### 創建目錄

* * * * *
<br>
>[danger] ##### 導入中間件

>[danger] ##### 編寫中間件
~~~
1.知識點from django.utils.deprecation import MiddlewareMixin繼承類
2.接受請求的方法名process_request()
3.返回響應的方法名process_response()
4.參數reuqest等同于view中的request
~~~
* 代碼案例
~~~
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class test1(MiddlewareMixin):
def process_request(self,request):
print("1號請求")
def process_response(self,request,response):
print("1號響應")
return response
class test2(MiddlewareMixin):
def process_request(self, request):
print("2號請求")
def process_response(self, request, response):
print("2號響應")
return response
~~~
* 打印結果
~~~
1號請求
2號請求
view響應
2號響應
1號響應
~~~
>[danger] ##### 發現條件不滿足時

當第一個過濾器發現已經不滿足,過濾篩選項時,可以利用HttpResponse,直接不經過views層
~~~
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class first(MiddlewareMixin):
def process_request(self,request):
print(request.META['REMOTE_ADDR'])
return HttpResponse('你沒有權限')
def process_response(self,request,response):
print("1號響應")
return response
~~~
>[success] # 參數流程
>[danger] ##### 統計模板運行時間
func 代指運行函數
~~~
from django.utils.deprecation import MiddlewareMixin
from django.urls import reverse
class TimeItMiddleware(MiddlewareMixin):
def process_request(self, request):
return
def process_view(self, request, func, *args, **kwargs):
if request.path != reverse('index'):
return None
start = time.time()
response = func(request)
costed = time.time() - start
print('{:.2f}s'.format(costed))
return response
def process_exception(self, request, exception):
pass
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
return response
~~~
>[danger] ##### process_request
~~~
一個請求來到middelware層,進入的第一個方法。一般情況我們可以在這里做一
些校驗,比如用戶登錄,或者HTTP中是否有認證頭之類的驗證。這個方法需要兩
種返回值,HttpResponse或者None,如果返回HttpResponse,那么接下來的
處理方法只會執行process_response,其他的方法將不會被執行。這里需要注意
的是,如果你的middleware在settings配置的MIDDLEWARE_CLASS的第一個的
話,那么剩下的middleware也不會被執行。另外一個返回值是None,如果返回
None,那么Django會繼續執行其他的方法。
~~~
>[danger] ##### process_view
~~~
這個方法是在process_request之后執行的,參數如上面代碼所示,其中的func
就是我們將要執行的view方法,因此我們要統計一個view的執行時間,可以在這
里來做。它的返回值跟process_request一樣,HttpResponse/None,邏輯也是
一樣。如果返回None,那么Django會幫你執行view函數,從而得到最終的
Response。
~~~
>[danger] ##### process_template_response
~~~
執行完上面的方法,并且Django幫忙我們執行完view之后,拿到最終的
response,如果是使用了模板的Response(是指通過return render(request,
'index.html', context={})的方式返回Response,就會來到這個方法中。這個方
法中我們可以對response做一下操作,比如Content-Type設置,或者其他
HEADER的修改/增加。
~~~
>[danger] ##### process_response
~~~
當所有流程都處理完畢,就來到了這個方法,這個方法的邏輯跟
process_template_response是完全一樣的。只是process_template_response
是針對帶有模板的response的處理。
~~~
>[danger] ##### process_exception
~~~
上面的所有處理方法是按順序介紹的,而這個不太一樣。只有在發生異常時,才
會進入到這個方法。哪個階段發生的異常呢?可以簡單的理解為在將要調用的
view中出現異常(就是在process_view的func函數中)或者返回的模板
Response在render時發生的異常,會進入到這個方法中。但是需要注意的是,
如果你在process_view中手動調用了func,就像我們上面做的那樣,那就不會觸
發process_exception了。這個方法接收到異常之后,可以選擇處理異常,然后
返回一個含有異常信息的HttpResponse,或者直接返回None,不處理,這種情
況Django會使用自己的異常模板。
~~~
- 網絡原理
- 為搭建框架做準備
- 簡單認識網路
- 自定義模擬網站案例
- 優化最終框架
- 數據存儲 -- data
- 用戶個人信息存儲 -- User.txt
- 路由映射 -- routes
- 處理用戶信息 -- routes_static.py
- 保存靜態文件 -- static
- templates -- html 集中處理模塊
- 首頁 -- index.html
- 登陸 -- login.html
- 用戶注冊頁面 -- register
- 日志模塊 -- log.gua.txt
- 啟動文件--server.py
- orm處理 -- model.py
- 日志模塊 -- utils.py
- 兩種數據庫類型
- 傳統數據庫了解篇
- 前端快速入門
- JS簡單使用入門
- css簡單快速入門
- DJANGO
- virtualenv-創建虛擬環境
- 項目結構
- django-admin中文配置
- django-打印sql語句
- django-基礎
- 認識MVC和MTV
- Django--初識
- Django--初識案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-數據庫配置
- ORM-model字段
- ORM-model字段解釋
- ORM-字段選項
- ORM-查詢
- ORM-四種常用查詢方法
- ORM-三種獲取數據
- ORM-其他查詢方式
- ORM-條件查詢雙線
- ORM-Q和F條件使用
- ORM-三種數據庫交互
- 案例 -- 一對多
- ORM-技巧/常見問題
- ORM-N+1 問題
- ORM-并發的處理
- ORM-數量查詢、
- ORM-正向反向查詢
- ORM-基礎案例一
- ORM-基礎一對多案例
- Django-templates
- Django-模板的繼承
- Django-模板的過濾
- Django-自定義模板的過濾
- Django-cookie
- Django-cookies 裝飾器
- Djang-session
- Django-CSRF
- Django-中間件 -- 后續了解
- Django- 緩存 -- 沒有深入了解
- Django-form
- From-ajax
- form-內部驗證處理
- form-屬性
- form-常用的標簽字段
- form-常用的下拉和選擇
- form-widget速查
- Django-ajax序列化
- Django-多種ajax寫法
- ajax-原生寫法
- ajax-$寫法
- ajax-ifram
- Django-ajax圖片上傳
- ajax-原始寫法
- ajax-正常寫法
- iframe+form
- 實戰寫法
- Django-常用自編寫組件
- Django-雙菜單組合搜索
- Django - 多菜單組合搜索
- Django-分頁
- django-綜合基礎
- 綜合基礎-render
- django-admin
- admin-頁面配置
- admin-字段配置
- admin-編輯頁面
- admin-forms驗證
- admin-創建抽象類
- django-驗證碼
- 驗證碼-第三方生成庫
- 驗證碼-view.py使用
- 驗證碼-注意引入Monaco.ttf
- django-用戶注冊
- 注冊-form 模塊
- 注冊-views 模塊
- 注冊-html模塊
- 注冊-model模塊
- django-用戶登錄三種
- session登錄
- form-session 寫法
- view-寫法
- Html-寫法
- model-寫法
- 繼承類登錄
- 外鍵關聯登錄
- django-簡單的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和數據庫關聯的寫法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系統
- APP目錄-models.py 創建
- APP目錄-基礎展示數據分析
- APP目錄-基礎數據展示cls
- ListView
- DetailView
- FormView
- 額外功能拓建
- 添加文章搜索/用戶文章查詢功能
- 增加一個友情鏈接
- 增加一個評論模塊
- App-利用Bootstrap4 搭建樣式
- 項目crm
- 思維導圖
- perfectCRM-項目名字
- settings.py-配置
- view.py-登陸/登出函數
- crm-app文件
- model.py-表的創建
- admin.py-注冊后臺
- view.py-視圖層
- static-靜態文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首頁模板