werkzeug的Request / Response 对象

来源:互联网 发布:生死狙击手游刷枪 软件 编辑:程序博客网 时间:2024/06/06 00:24

request 和response 对象是对WSGI环境或WSGI应用的返回值的包装,其本质也是一种WSGI应用。

工作原理

WSGI应用必须传入两个参数:WSGI环境和WSGI启动响应(start_response)函数.start_response函数常用于服务器响应客户端过程的起始阶段。Request类对程序环境进行封装,以便客户端更好地访问request变量(表格数据,request头文件等)。Response 是可供用户创建的一种标准的WSGI应用。基于Werkzeug的helllo world程序如下:

from werkzeug.wrappers import Responseapplication = Response('Hello World!')

进一步的写成如下的函数形式:

from werkzeug.wrappers import Request, Responsedef 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.applicationdef 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, ETagRequestMixinclass 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, BaseRequestclass Request(BaseRequest, AcceptMixin):    pass
原创粉丝点击