1. 瀏覽器解析輸入的url
2. 查詢url對應的ip位址
3. 通過ip位址訪問我們的伺服器
1. 請求進入wsgi伺服器(我在這裡省略了可能存在的**伺服器,比如nginx)
2. wsgi伺服器將請求包裝後,傳遞給django應用
3. django應用根據請求路徑找到相應的處理函式進行處理
4. 處理完成後,django應用將響應返回給wsgi伺服器
5. wsgi伺服器將django應用返回的響應包裝後,返回響應
4. 伺服器返回響應內容,瀏覽器渲染輸出
#wsgi.py檔案wsgihandler類在初始化時,首先載入中介軟體,將要請求的函式 _get_response用中介軟體封裝起來(中介軟體相當於裝飾器),執行的時候,中介軟體就會執行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
# wsgi.py檔案
def接下來,就是請求呼叫wsgihandlerload_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
1. 例項化乙個request_class
2. 通過get_response獲取請求,get_response最終會呼叫被中介軟體封裝後的函式 _get_response
def至此再將response返回給server,整個請求流程完畢_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
下面是這個過程的流程圖
我也以一種函式的形式,寫了一下這個流程
def process_request(request)django對於乙個請求,主要過程就是尋找請求對應的檢視函式,呼叫被中介軟體封裝後的檢視函式,返回響應。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原始碼分析 引導
宣告 本文為 不難發現,生成一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 用...