国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

從請求到響應過程中django都做了哪些處理

2020-02-15 22:39:00
字體:
來源:轉載
供稿:網友

前言

最近面試的時候,被面試官問道一個問題,就是 request.user 里面的 user 是怎樣得到的,這個問題當時沒有回答上來,可以說是非常的尷尬,所以趕快查了一些資料,看了一些源碼,特地來總結一下這個問題。

要想回答為什么可以直接通過 request.user 得到請求的用戶,應該先來看看請求被處理以及如何返回響應的流程。今天先總結一下 django 從請求到響應都進行了哪些過程。

WSGI

當客戶端發送一次請求后,最先處理請求的實際上是 web 服務器就是我們經常說的 nginx、Apache 這類的 web 服務器,而 WSGI 的作用就是把 web 服務器和 web 框架 (Django) 連接起來。WSGI 被分為了兩個部分:服務端和應用端。為了處理一個 WSGI 的響應,服務端執行應用程序并向應用端提供一個回調函數,應用端處理請求并使用提供的回調將響應返回給服務端。

本質上來講,我覺得 WSGI 就是 web 服務器和 django 應用之間的一個聯系人。

數據流

當用戶向你的應用發送一個請求的時候,一個 WSGI handler 將會被初始化,它會完成以下工作:

    導入 settings.py 和 django 的異常類 使用 load_middleware 方法加載 settings.py 中 MIDDLEWARE_CLASSES 或者 MIDDLEWARES 元組中所用的 middleware classes. 創建四個列表 (_request_middleware,_view_middleware, _response_middleware, _exception_middleware),里面分別包含處理 request,view,response 和 exception 的方法。 WSGI Handler 將實例化一個 django.http.HTTPRequest 對象的子類,django.core.handlers.wsgi.WSGIRequest. 循環遍歷處理 request 的方法 (_request_middleware 列表),并按照順序調用他們 解析請求的 url 循環遍歷每個處理 view 的方法 (_view_middleware 列表) 如果找的到的話,就調用視圖函數 處理任何異常的方法 (_exception_middleware 列表) 循環遍歷每個處理響應的方法 (_response_middleware 列表),(從內向外,與請求中間件的順序相反) 最后得到一個響應,并調用 web server 提供的回調函數

中間件

中間件被用在了 django 的許多關鍵功能中:例如,使用 CSRF 中間鍵來防止跨站請求偽造攻擊。它們也被用來處理會話數據,身份認證和授權同樣是由中間件來完成的。我們也可以自己編寫中間件來調整或者(短路)通過應用程序的數據流。

django 的中間件至少含有以下四個方法中的一個:process_request, process_response, process_view, process_exception。這些方法會被 WSGI handler 收集并按照順序調用。

process_request

我們可以先來看看 django.contrib.auth.middleware.AuthenticationMiddleware:

def get_user(request): if not hasattr(request, '_cached_user'):  request._cached_user = auth.get_user(request) return request._cached_userclass AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request):  assert hasattr(request, 'session'), (    "The Django authentication middleware requires session middleware "    "to be installed. Edit your MIDDLEWARE%s setting to insert "    "'django.contrib.sessions.middleware.SessionMiddleware' before "    "'django.contrib.auth.middleware.AuthenticationMiddleware'."  ) % ("_CLASSES" if settings.MIDDLEWARE is None else "")  request.user = SimpleLazyObject(lambda: get_user(request))            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥芬河市| 天祝| 射阳县| 富阳市| 峡江县| 盐亭县| 磐安县| 固镇县| 南岸区| 隆化县| 玛曲县| 平舆县| 攀枝花市| 新竹县| 米林县| 监利县| 喀喇沁旗| 元朗区| 方正县| 库伦旗| 鹤庆县| 莱阳市| 清河县| 栾城县| 图木舒克市| 阳朔县| 和龙市| 桦川县| 澄江县| 宜兰市| 固原市| 江安县| 灵丘县| 南开区| 府谷县| 揭西县| 华宁县| 宁武县| 淅川县| 东乌珠穆沁旗| 沿河|