
Werkzeug库中的wrappers模块主要对request和response进行封装。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应用。
|
|
上面的小例子的实现步骤分析:
-
根据传入web应用的
environ构造请求对象request; -
web应用构造响应对象
response; -
调用响应对象
response。调用过程中产生三个值:app_iter、status、headers,其中status和headers作为参数传递给函数start_response用于生成响应报文首行的相关信息,而app_iter作为响应的内容(它是一个可迭代对象)返回给WSGI网关; -
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类 ——为响应提供认证的类。
Request和Response
终于讲到Request类和Response类了。
Request类继承自BaseRequest类,并且结合一些请求相关的Mixin类,具体如下:
|
|
Response类继承自BaseResponse类,并且结合一些响应相关的Mixin类,具体如下:
|
|
至此,可以从wrappers模块中引入Request类和Response用于构建请求对象和响应对象。
版权声明
Learn Python by Fan Chunke is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由Fan Chunke创作并维护的Learn Python博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Learn Python 博客( http://fanchunke.me ),版权所有,侵权必究。




近期评论