成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

從請(qǐng)求到響應(yīng)過(guò)程中django都做了哪些處理-創(chuàng)新互聯(lián)

前言

在綿竹等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,綿竹網(wǎng)站建設(shè)費(fèi)用合理。

最近面試的時(shí)候,被面試官問(wèn)道一個(gè)問(wèn)題,就是 request.user 里面的 user 是怎樣得到的,這個(gè)問(wèn)題當(dāng)時(shí)沒(méi)有回答上來(lái),可以說(shuō)是非常的尷尬,所以趕快查了一些資料,看了一些源碼,特地來(lái)總結(jié)一下這個(gè)問(wèn)題。


要想回答為什么可以直接通過(guò) request.user 得到請(qǐng)求的用戶(hù),應(yīng)該先來(lái)看看請(qǐng)求被處理以及如何返回響應(yīng)的流程。今天先總結(jié)一下 django 從請(qǐng)求到響應(yīng)都進(jìn)行了哪些過(guò)程。


WSGI


當(dāng)客戶(hù)端發(fā)送一次請(qǐng)求后,最先處理請(qǐng)求的實(shí)際上是 web 服務(wù)器就是我們經(jīng)常說(shuō)的 nginx、Apache 這類(lèi)的 web 服務(wù)器,而 WSGI 的作用就是把 web 服務(wù)器和 web 框架 (Django) 連接起來(lái)。WSGI 被分為了兩個(gè)部分:服務(wù)端和應(yīng)用端。為了處理一個(gè) WSGI 的響應(yīng),服務(wù)端執(zhí)行應(yīng)用程序并向應(yīng)用端提供一個(gè)回調(diào)函數(shù),應(yīng)用端處理請(qǐng)求并使用提供的回調(diào)將響應(yīng)返回給服務(wù)端。

本質(zhì)上來(lái)講,我覺(jué)得 WSGI 就是 web 服務(wù)器和 django 應(yīng)用之間的一個(gè)聯(lián)系人。


數(shù)據(jù)流


當(dāng)用戶(hù)向你的應(yīng)用發(fā)送一個(gè)請(qǐng)求的時(shí)候,一個(gè) WSGI handler 將會(huì)被初始化,它會(huì)完成以下工作:

  1. 導(dǎo)入 settings.py 和 django 的異常類(lèi)
  2. 使用 load_middleware 方法加載 settings.py 中 MIDDLEWARE_CLASSES 或者 MIDDLEWARES 元組中所用的 middleware classes.
  3. 創(chuàng)建四個(gè)列表 (_request_middleware,_view_middleware, _response_middleware, _exception_middleware),里面分別包含處理 request,view,response 和 exception 的方法。
  4. WSGI Handler 將實(shí)例化一個(gè) django.http.HTTPRequest 對(duì)象的子類(lèi),django.core.handlers.wsgi.WSGIRequest.
  5. 循環(huán)遍歷處理 request 的方法 (_request_middleware 列表),并按照順序調(diào)用他們
  6. 解析請(qǐng)求的 url
  7. 循環(huán)遍歷每個(gè)處理 view 的方法 (_view_middleware 列表)
  8. 如果找的到的話(huà),就調(diào)用視圖函數(shù)
  9. 處理任何異常的方法 (_exception_middleware 列表)
  10. 循環(huán)遍歷每個(gè)處理響應(yīng)的方法 (_response_middleware 列表),(從內(nèi)向外,與請(qǐng)求中間件的順序相反)
  11. 最后得到一個(gè)響應(yīng),并調(diào)用 web server 提供的回調(diào)函數(shù)

中間件


中間件被用在了 django 的許多關(guān)鍵功能中:例如,使用 CSRF 中間鍵來(lái)防止跨站請(qǐng)求偽造攻擊。它們也被用來(lái)處理會(huì)話(huà)數(shù)據(jù),身份認(rèn)證和授權(quán)同樣是由中間件來(lái)完成的。我們也可以自己編寫(xiě)中間件來(lái)調(diào)整或者(短路)通過(guò)應(yīng)用程序的數(shù)據(jù)流。


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


process_request


我們可以先來(lái)看看 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_user

class 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))

網(wǎng)站名稱(chēng):從請(qǐng)求到響應(yīng)過(guò)程中django都做了哪些處理-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article6/dhoeig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、定制開(kāi)發(fā)、全網(wǎng)營(yíng)銷(xiāo)推廣、電子商務(wù)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
镇远县| 江都市| 浦江县| 沛县| 财经| 镇康县| 新河县| 南江县| 永寿县| 广平县| 平谷区| 达尔| 甘泉县| 迁安市| 吉林市| 荔浦县| 丽水市| 江阴市| 泽普县| 渭南市| 会泽县| 余姚市| 房产| 玛多县| 乃东县| 海伦市| 广南县| 巴彦县| 正镶白旗| 邯郸市| 伊川县| 和政县| 伊金霍洛旗| 嘉峪关市| 宣城市| 吉水县| 大新县| 那曲县| 民和| 库伦旗| 丹东市|