request 和response 对象是对WSGI环境或WSGI应用的返回值的包装,其本质也是一种WSGI应用。
工作原理
WSGI应用必须传入两个参数:WSGI环境和WSGI启动响应(start_response)函数.start_response函数常用于服务器响应客户端过程的起始阶段。Request类对程序环境进行封装,以便客户端更好地访问request变量(表格数据,request头文件等)。Response 是可供用户创建的一种标准的WSGI应用。基于Werkzeug的helllo world程序如下:
from werkzeug.wrappers import Response
application = Response('Hello World!')
进一步的写成如下的函数形式:
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
response = Response("Hello %s!"
% request.args.get('name', 'World!'))
return response(environ, start_response)
进一步,改写成装饰器的形式如下:
from werkzeug.wrappers import Request, Response
@Request.application
def application(request):
return Response(
"Hello %s!"%request.args.get('name', 'World!'))
对象的可变性和重用性
request 对象的性质:
1.request 是不可变对象。默认不支持修改。然而如果需要修改,可以用可变属性替代不可变属性。
2.request 对象可以在同一个线程中共享,但是其实不安全的。在多线程中使用,需要加锁来调用。
3.request 对象 不支持pickle 操作
response 对象性质:
1.response 是可变对象
2.response 对象可以进行pickle 操作和复制,但是必须首先执行 freeze()方法
3. Werkzeug 0.6之后,response 对象是线程安全的
4.response 对象支持深度复制(copy.deepcopy)
基类包装器
基类包装器定义了一组通用的操作,以插件的形式实现用户代理解析和etag处理。mixin类或 Request 和Response可以通过继承的方式使用这些特性.
源码文件werkzeug.wrappers.py,列出了所有的基类包装类。
class werkzeug.wrappers.BaseRequest(
environ,populate_request=True, shallow=False)
BaseRequest是request对象的基类。其并没有实现诸如实体tag解析或缓存控制等功能。request对象创建了WSGI环境并将其作为第一个参数,在populate_request=True的条件下将其自身作werkzeug.request加入到WSGI环境当中去。request 对象中加入了mixins属性和一些附加的功能。源码中的Request类是BaseRequest 和一些重要的Minxin类的子类。
一个非常好的编程实践是,通过继承BaseRequest和一些Mixin类来实现定制的Request类。举例如下:
from werkzeug.wrappers import BaseRequest, ETagRequestMixin
class Request(BaseRequest, ETagRequestMixin):
pass
request 对象默认编码方式是utf-8
class werkzeug.wrappers.BaseResponse(
response=None,status=None,
headers=None,mimetype=None,
content_type=None, direct_passthrough=False)
reponse基类,最重要的是,一个response 对象就是一个标准的WSGI 应用。它接收到响应参数(报头,body,状态码)并初始化,之后启动WSGI响应并调用environ 开始响应客户端的请求。将实际的响应信息发送给服务器之前,WSGI应用通常会处理一些终端的信息。由于WSGI应用可以在响应客户端请求之前捕获异常,因此这一特性有利于debug程序。
一个简单的例子如下:
from werkzeug.wrappers import BaseResponse as Response
def index():
return Response('Index page')
def application(environ, start_response):
path = environ.get('PATH_INFO') or '/'
if path == '/':
response = index()
else:
response = Response('Not Found', status=404)
return response(environ, start_response)
reponse对象默认编码方式是utf-8
Mixin 类
Werkzeug 提供了mixins 类用于扩展HTTP的功能,例如etags,cache控制,用户代理等等。你可以继承特定的mixin类来扩展 BaseRequest 或BaseResponse。下边举一个简单的例子,用于解析接收的报头。
from werkzeug.wrappers import AcceptMixin, BaseRequest
class Request(BaseRequest, AcceptMixin):
pass