django原始碼分析 請求流程

2022-08-03 19:00:19 字數 3729 閱讀 2838

1. 瀏覽器解析輸入的url

2. 查詢url對應的ip位址

3. 通過ip位址訪問我們的伺服器

1.  請求進入wsgi伺服器(我在這裡省略了可能存在的**伺服器,比如nginx)

2.  wsgi伺服器將請求包裝後,傳遞給django應用

3.  django應用根據請求路徑找到相應的處理函式進行處理

4.  處理完成後,django應用將響應返回給wsgi伺服器

5. wsgi伺服器將django應用返回的響應包裝後,返回響應

4. 伺服器返回響應內容,瀏覽器渲染輸出

#wsgi.py檔案

class

wsgihandler(base.basehandler):

request_class =wsgirequest

def__init__(self, *args, **kwargs):

super().

__init__(*args, **kwargs)

self.load_middleware()

def__call__

(self, environ, start_response):

set_script_prefix(get_script_name(environ))

signals.request_started.send(sender=self.__class__, environ=environ)

request =self.request_class(environ)

response =self.get_response(request)

response._handler_class = self.__class__

status = '

%d %s

' %(response.status_code, response.reason_phrase)

response_headers =list(response.items())

for c in

response.cookies.values():

'set-cookie

', c.output(header=''

))) start_response(status, response_headers)

if getattr(response, '

file_to_stream

', none) is

not none and environ.get(''):

response = environ['

'](response.file_to_stream)

return response

wsgihandler類在初始化時,首先載入中介軟體,將要請求的函式 _get_response用中介軟體封裝起來(中介軟體相當於裝飾器),執行的時候,中介軟體就會執行

# wsgi.py檔案
def

load_middleware(self):

...self._view_middleware =

self._template_response_middleware =

self._exception_middleware =

handler =convert_exception_to_response(self._get_response)

for middleware_path in

reversed(settings.middleware):

middleware =import_string(middleware_path)

try:

mw_instance =middleware(handler)

except

middlewarenotused as exc:

...handler =convert_exception_to_response(mw_instance)

self._middleware_chain = handler

接下來,就是請求呼叫wsgihandler

1. 例項化乙個request_class

2. 通過get_response獲取請求,get_response最終會呼叫被中介軟體封裝後的函式 _get_response 

def

_get_response(self, request):

response =none

if hasattr(request, '

urlconf'):

urlconf =request.urlconf

set_urlconf(urlconf)

resolver =get_resolver(urlconf)

else

: resolver =get_resolver()

resolver_match =resolver.resolve(request.path_info)

callback, callback_args, callback_kwargs =resolver_match

request.resolver_match =resolver_match

...if response is

none:

try:

except

exception as e:

response =self.process_exception_by_middleware(e, request)

...return response

至此再將response返回給server,整個請求流程完畢

下面是這個過程的流程圖

我也以一種函式的形式,寫了一下這個流程

def process_request(request)

try:

# 請求前的中介軟體

response =pre_middleware(request)

ifresponse:

return

response

# 檢視中介軟體

response =view_middleware(request, view_fun)

ifnot response:

try:

# 執行檢視函式

reponses =view_fun(request)

except:

# 異常中介軟體

responser =exception_middleware()

if hasattr(response, '

render'):

# 模板中介軟體

response =template_middleware(response)

try:

response =response.render()

except:

response =exception_middleware()

# 請求後的中介軟體

response =post_middleware(request, response)

except:

response =exception()

return response

django對於乙個請求,主要過程就是尋找請求對應的檢視函式,呼叫被中介軟體封裝後的檢視函式,返回響應。

Django原始碼分析 引導

宣告 本文為 不難發現,生成一httpserver物件,並將wsgi handler作為http請求handle 第二種方式,以apache為例那更簡明了 sethandler python program pythonhandler django.core.handlers.modpython s...

Vue原始碼分析(流程分析)

使用步驟 1.編寫 頁面 模板 1.直接在html標籤中寫 2.使用template 3.使用單檔案 2.建立vue例項 1.在vue 的建構函式中 data,methods,computer,watcher,props,3.將vue掛載到頁面中 mount 資料驅動模型 vue執行流程 1.獲得模...

lucene update流程原始碼分析

update操作buffer到documentswriterdeletequeue裡,flush時處理deletes.documentswriterdeletequeue使用global deleteslice和dwpt deleteslice儲存deletes。dwpt deleteslice 用...