请求/响应对象 — Werkzeug 文档

来自菜鸟教程
Werkzeug/docs/1.0.x/wrappers
跳转至:导航、​搜索

请求/响应对象

请求和响应对象包装 WSGI 环境或来自 WSGI 应用程序的返回值,以便它是另一个 WSGI 应用程序(包装整个应用程序)。

它们是如何工作的

您的 WSGI 应用程序总是传递两个参数。 WSGI“环境”和用于启动响应阶段的 WSGI start_response 函数。 Request 类包装了 environ 以便更容易地访问请求变量(表单数据、请求头等)。

另一方面,Response 是您可以创建的标准 WSGI 应用程序。 Werkzeug 中简单的 hello 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)

因为这是一项非常常见的任务,Request 对象为此提供了一个帮助程序。 上面的代码可以改写成这样:

from werkzeug.wrappers import Request, Response

@Request.application
def application(request):
    return Response("Hello %s!" % request.args.get('name', 'World!'))

application 仍然是一个有效的 WSGI 应用程序,它接受环境和 start_response 可调用。


包装器的可变性和可重用性

Werkzeug 请求和响应对象的实现试图通过尽可能地禁止某些事情来保护您免受常见的陷阱。 这有两个目的:高性能和避免陷阱。

对于请求对象,以下规则适用:

  1. 请求对象是不可变的。 默认情况下不支持修改,但是如果您需要修改它,您可以将不可变属性替换为可变属性。
  2. 请求对象可以在同一个线程中共享,但它本身不是线程安全的。 如果您需要从多个线程访问它,请在调用周围使用锁。
  3. 不可能腌制请求对象。

对于响应对象,以下规则适用:

  1. 响应对象是可变的
  2. 响应对象可以在调用 freeze() 后进行腌制或复制。
  3. 从 Werkzeug 0.6 开始,对多个 WSGI 响应使用相同的响应对象是安全的。
  4. 可以使用 copy.deepcopy 创建副本。


基本包装

这些对象实现了一组通用的操作。 他们缺少花哨的插件功能,如用户代理解析或 etag 处理。 这些功能可以通过混合各种 mixin 类或使用 RequestResponse 来获得。


Mixin 类

Werkzeug 还为各种 HTTP 相关功能提供了 helper mixin,例如 etags、缓存控制、用户代理等。 子类化时,您可以混合这些类以扩展 BaseRequestBaseResponse 对象的功能。 这是解析接受标头的请求对象的小示例:

from werkzeug.wrappers import AcceptMixin, BaseRequest

class Request(BaseRequest, AcceptMixin):
    pass

RequestResponse 类是 BaseRequestBaseResponse 类的子类,并实现了 Werkzeug 提供的所有 mixins:

通用描述符

响应流

接受

验证

CORS

标签

用户代理

额外的 Mixin 类

这些混入不包含在默认的 RequestResponse 类中。 它们提供了需要通过创建自己的子类来选择的额外行为:

class Response(JSONMixin, BaseResponse):
    pass

JSON