Werkzeug庫——wrappers模組

發表於2017-05-26

Werkzeug庫中的wrappers模組主要對requestresponse進行封裝。request包含了客戶端發往伺服器的所有請求資訊,response包含了web應用返回給客戶端的所有資訊。wrappers模組對請求和響應的封裝簡化了客戶端、伺服器和web應用通訊的流程。本文主要介紹wrappers模組中重要的類。

BaseRequest

BaseRequest是一個非常基礎的請求類,它可以和其他的“混合”類結合在一起構建複雜的請求類。只要傳遞一個環境變數environ(由WSGI伺服器根據請求產生),便可以構造一個BaseRequest例項。其建構函式如下:

初始化後,形成的例項request便具有了一些屬性可以訪問,這些屬性只能以“只讀”的方式訪問。例如:

  • url_charset
  • want_form_data_parsed
  • stream
  • args
  • data
  • form
  • values
  • files
  • cookies
  • headers
  • path
  • full_path
  • script_root
  • url
  • base_url
  • url_root
  • host_url
  • host
  • access_route
  • remote_addr

BaseRequest中還有兩個類方法比較常用:

from_values(cls, *args, kwargs)**

這個類方法可以根據提供的引數構建一個請求。

application(cls, f)

這個類方法是一個裝飾器,可以用來裝飾WSGI可呼叫物件或函式。

以上屬性和方法的具體用法可以參考Request——werkzeug文件

BaseResponse

BaseResponse類是一個響應類,用它可以封裝一個response物件。response物件最大的特點是它是一個WSGI應用。

在之前介紹WSGI規範的文章中曾介紹過Web伺服器閘道器,它簡化了伺服器和web應用之間的通訊過程,它要求伺服器和web應用要遵循WSGI規範進行開發。對於web應用而言,應用應該實現一個函式或者一個可呼叫物件,這樣WSGI伺服器可以通過呼叫myWebApp(environ, start_response)從web應用獲得響應內容。

response響應物件就是這樣一個WSGI應用物件。在其實現過程中有一個__call__方法,可以實現對一個response物件的呼叫。程式碼如下:

這樣,我們就可以很清楚地理解WSGI應用的實現過程。下面是一個非常簡單的WSGI應用。

上面的小例子的實現步驟分析:

  1. 根據傳入web應用的environ構造請求物件request
  2. web應用構造響應物件response
  3. 呼叫響應物件response。呼叫過程中產生三個值:app_iterstatusheaders,其中statusheaders作為引數傳遞給函式start_response用於生成響應報文首行的相關資訊,而app_iter作為響應的內容(它是一個可迭代物件)返回給WSGI閘道器
  4. WSGI閘道器將返回的資訊組成響應首行、響應首部、響應主體等,形成響應報文發回給客戶端。

BaseResponse類中還有一些屬性和方法,以下屬性和方法的具體用法可以參考Response——werkzeug文件

  • 屬性
    • status_code
    • status
    • data
    • is_stream
    • is_sequence
    • ······
  • 方法
    • call_on_close(func)
    • close()
    • freeze()
    • force_type() 類方法
    • from_app() 類方法
    • set_data()
    • get_data()
    • _ensure_sequence()
    • make_sequence()
    • iter_encoded()
    • calculate_content_length()
    • set_cookie()
    • delete_cookie()
    • get_wsgi_headers(environ)
    • get_app_iter(environ)
    • get_wsgi_response(environ)
    • __call__(environ, start_response)
    • ······

Mixin類

BaseRequest類和BaseResponse類是請求和響應最基礎的類。wrappers模組中還提供了一些Mixin類,用於擴充套件請求類和響應類。

有關請求類的Mixin

有關請求類的Mixin類主要有:

  • AcceptMixin類 ——請求報文中關於客戶端希望接收的資料型別的類。
  • ETagRequestMixin類 ——請求報文中關於Etag和Cache的類。
  • UserAgentMixin類 ——請求報文中關於user_agent的類。
  • AuthorizationMixin類 ——請求報文中關於認證的類。
  • CommonRequestDescriptorsMixin類 ——通過這個類可以獲取請求首部中的相關資訊。

有關響應類的Mixin

有關響應類的Mixin類主要有:

  • ETagResponseMixin類 ——為響應增加Etag和Cache控制的類。
  • ResponseStreamMixin類 ——為響應可迭代物件提供一個“只寫”的介面的類。
  • CommonResponseDescriptorsMixin類 ——通過這個類可以獲取響應首部中的相關資訊。
  • WWWAuthenticateMixin類 ——為響應提供認證的類。

RequestResponse

終於講到Request類和Response類了。

Request類繼承自BaseRequest類,並且結合一些請求相關的Mixin類,具體如下:

Response類繼承自BaseResponse類,並且結合一些響應相關的Mixin類,具體如下:

至此,可以從wrappers模組中引入Request類和Response用於構建請求物件和響應物件。

 

相關文章