【轉】請求處理機制其一:進入Django前的准備 -开发者知识库

【轉】請求處理機制其一:進入Django前的准備 -开发者知识库,第1张

一個 Request 到達了!

首先發生的是一些和 Django 有關(前期准備)的其他事情,分別是:

  • 如果是 Apache/mod_python 提供服務,request 由 mod_python 創建的 django.core.handlers.modpython.ModPythonHandler 實例傳遞給 Django。
  • 如果是其他服務器,則必須兼容 WSGI,這樣,服務器將創建一個 django.core.handlers.wsgi.WsgiHandler 實例。

這兩個類都繼承自 django.core.handlers.base.BaseHandler,它包含對任何類型的 request 來說都需要的公共代碼。

快准備處理器(Handler)

當上面其中一個處理器實例化后,緊接着發生了一系列的事情:

  1. 這個處理器(handler)導入你的 Django 配置文件。
  2. 這個處理器導入 Django 的自定義異常類。
  3. 這個處理器調用它自己的 load_middleware 方法,加載所有列在 MIDDLEWARE_CLASSES 中的 middleware 類並且內省它們。

最后一條有點復雜,我們仔細瞧瞧。

一個 middleware 類可以滲入處理過程的四個階段:request,view,response 和 exception。要做到這一點,只需要定義指定的、恰當的方 法:process_request,process_view, process_response 和 process_exception。middleware 可以定義其中任何一個或所有這些方法,這取決於你想要它提供什么樣的功能。

當處理器內省 middleware 時,它查找上述名字的方法,並建立四個列表作為處理器的實例變量:

  • _request_middleware 是一個保存 process_request 方法的列表(在每一 種情況下,它們是真正的方法,可以直接調用),這些方法來自於任一個定義了它們的 middleware 類。
  • _view_middleware 是一個保存 process_view 方法的列表,這些方法來自於任一個定義了它們的 middleware 類。
  • _response_middleware 是一個保存 process_response 方法的列表,這些方法來自於任一個定義了它們的 middleware 類。
  • _exception_middleware 是一個保存 process_exception 方法的列表,這些方法來自於任一個定義了它們的 middleware 類。
HttpRequest 准備好了就可以進入 Django

現在處理器已經准備好真正開始處理了,因此它給調度程序發送一個信號 request_started(Django 內部的調度程序允許各種不同的組件聲明它們正在干 什么,並可以寫一些代碼監聽特定的事件。關於這一點目前還沒有官方的文檔, 但在 wiki 上有一些注釋。)。接下來它實例化一個 django.http.HttpRequest 的子類。

根據不同的處理器,可能是 django.core.handlers.modpython.ModPythonRequest 的一個實例,也可能是 django.core.handlers.wsgi.WSGIRequest 的一個實例。需要兩個不同的類是因 為 mod_python 和 WSGI APIs 以不同的格式傳入 request 信息,這個信息需要 解析為 Django 能夠處理的一個單獨的標准格式。

一旦一個 HttpRequest 或者類似的東西存在了,處理器就調用它自己的 get_response 方法,傳入這個 HttpRequest 作為唯一的參數。這里就是幾乎所有真正的活動發生的地方。

最佳答案:

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
U19学习网站 » 【轉】請求處理機制其一:進入Django前的准備 -开发者知识库