werkzeug的Request / Response 对象

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值