WSGI帮助者¶
以下类和函数旨在使使用wsgi规范更容易或在wsgi层上操作。此模块的所有功能都在高级 请求/响应对象 .
迭代器/流帮助器¶
这些类和函数简化了使用wsgi应用程序迭代器和输入流的工作。
- class werkzeug.wsgi.ClosingIterator(iterable, callbacks=None)¶
wsgi规范要求所有中间件和网关都遵守 close 应用程序返回的ITerable的回调。因为向返回的iterable添加另一个close操作很有用,并且添加自定义iterable是一项无聊的任务,所以此类可用于:
return ClosingIterator(app(environ, start_response), [cleanup_session, cleanup_locals])
如果只有一个关闭函数,则可以传递它而不是列表。
如果应用程序使用响应对象并在响应启动时完成处理,则不需要关闭迭代器::
try: return response(environ, start_response) finally: cleanup_session() cleanup_locals()
- 参数:
iterable (t.Iterable[bytes]) --
callbacks (None | (t.Callable[[], None] | t.Iterable[t.Callable[[], None]])) --
- class werkzeug.wsgi.FileWrapper(file, buffer_size=8192)¶
此类可用于转换
file
-像一个物体变成一个物体。它产生 buffer_size 阻止,直到文件完全读取。您不应该直接使用这个类,而应该使用
wrap_file()
使用wsgi服务器的文件包装支持(如果可用)的函数。Changelog
在 0.5 版本加入.
如果将此对象与
Response
您必须使用 direct_passthrough 模式。
- class werkzeug.wsgi.LimitedStream(stream, limit, is_max=False)¶
对流进行包装,使其不会读取超过给定限制的内容。这是用来限制
wsgi.input
发送到Content-Length
标题值或Request.max_content_length
。当在已经达到限制之后尝试读取时,
on_exhausted()
被称为。当限制为最大值时,将引发RequestEntityTooLarge
。如果从流中读取返回零字节或引发错误,
on_disconnect()
被调用,这引发了ClientDisconnected
。当限制为最大值且读取了零字节时,不会引发错误,因为它可能是流的末尾。如果在基础流(如太大的文件或无限流)耗尽之前达到限制,则不能安全地读取流的其余内容。根据服务器对此的处理方式,客户端可能会显示“连接重置”失败,而不是看到413响应。
- 参数:
Changelog
在 2.3 版本发生变更: 手柄
max_content_length
不同于Content-Length
。在 2.3 版本发生变更: 机具
io.RawIOBase
而不是io.IOBase
。- exhaust()¶
通过读取直到达到限制或客户端断开连接,返回剩余数据来耗尽流。
Changelog
在 2.3 版本发生变更: 返回剩余数据。
在 2.2.3 版本发生变更: 处理包装的流返回的字节数少于请求的情况。
- 返回类型:
- on_disconnect(error=None)¶
当尝试的读取在达到限制之前收到零字节时调用。这表示客户端在发送完整的请求正文之前断开了连接。
默认行为是引发
ClientDisconnected
,除非该限制是最大值,并且没有出现错误。Changelog
在 2.3 版本发生变更: 添加了
error
参数。如果限制是最大值且未引发错误,则不执行任何操作。在 2.3 版本发生变更: 任何返回值都将被忽略。
- 参数:
error (Exception | None) --
- 返回类型:
None
- on_exhausted()¶
在达到限制后尝试读取时调用。
默认行为是不执行任何操作,除非限制是最大值,在这种情况下它会引发
RequestEntityTooLarge
。Changelog
在 2.3 版本发生变更: 加薪
RequestEntityTooLarge
如果限制是最大值。在 2.3 版本发生变更: 任何返回值都将被忽略。
- 返回类型:
None
- werkzeug.wsgi.wrap_file(environ, file, buffer_size=8192)¶
包装文件。这将使用wsgi服务器的文件包装器(如果可用),或者使用通用的
FileWrapper
.Changelog
在 0.5 版本加入.
如果使用来自WSGI服务器的文件包装器,重要的是不要从应用程序内部迭代它,而是原封不动地传递它。如果要在响应对象内传递文件包装器,则必须设置
Response.direct_passthrough
至 True 。有关文件包装器的详细信息,请参阅 PEP 333 .
环境帮助者¶
这些函数在WSGI环境中运行。它们提取有用的信息或执行常见的操作:
- werkzeug.wsgi.get_host(environ, trusted_hosts=None)¶
返回给定WSGI环境的主机。
这个
Host
最好使用标题,然后SERVER_NAME
如果没有设置的话。仅当该端口不同于协议的标准端口时,返回的主机才会包含该端口。或者,使用验证主机是否受信任
host_is_trusted()
抚养一个SecurityError
如果不是。- 参数:
environ (WSGIEnvironment) -- 一个WSGI环境字典。
trusted_hosts (t.Iterable[str] | None) -- 受信任主机名列表。
- 返回:
主机,必要时带端口。
- 抛出:
SecurityError -- 如果主机不受信任。
- 返回类型:
- werkzeug.wsgi.get_content_length(environ)¶
返回
Content-Length
以整型表示的标头值。如果未给出标头或Transfer-Encoding
标头为chunked
,None
返回以指示流请求。如果值不是整数或负数,则返回0。- 参数:
environ (WSGIEnvironment) -- 从中获取内容长度的WSGI环境。
- 返回类型:
int | None
Changelog
在 0.9 版本加入.
- werkzeug.wsgi.get_input_stream(environ, safe_fallback=True, max_content_length=None)¶
返回经过包装的WSGI输入流,以便可以安全地读取它,而不需要经过
Content-Length
标题值或max_content_length
。如果
Content-Length
超过max_content_length
一种RequestEntityTooLarge
`413 Content Too Large
出现错误。如果WSGI服务器设置
environ["wsgi.input_terminated"]
,则表示服务器处理终止流,因此直接读取是安全的。例如,知道如何安全地处理分块请求的服务器将设置此设置。如果
max_content_length
已设置,则可以在以下情况下在流上强制执行wsgi.input_terminated
已经设置好了。否则,除非用户显式禁用此安全回退,否则将返回空流。如果在基础流(如太大的文件或无限流)耗尽之前达到限制,则不能安全地读取流的其余内容。根据服务器对此的处理方式,客户端可能会显示“连接重置”失败,而不是看到413响应。
- 参数:
- 返回类型:
t.IO[bytes]
Changelog
在 2.3.2 版本发生变更:
max_content_length
仅适用于流请求,如果服务器设置wsgi.input_terminated
。在 2.3 版本发生变更: 检查
max_content_length
如果超过该值,则引发错误。在 0.9 版本加入.
- werkzeug.wsgi.get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None)¶
从WSGI环境中的部件重新创建请求的URL。
URL是IRI,而不是URI,因此它可能包含Unicode字符。使用
iri_to_uri()
将其转换为ASCII。
便利助手¶
- werkzeug.wsgi.responder(f)¶
将函数标记为响应程序。用它修饰一个函数,它将自动调用返回值作为wsgi应用程序。
例子::
@responder def application(environ, start_response): return Response('Hello World!')
- 参数:
f (t.Callable[..., WSGIApplication]) --
- 返回类型:
WSGIApplication
- werkzeug.testapp.test_app(req)¶
转储环境的简单测试应用程序。您可以使用它检查Werkzeug是否正常工作:
>>> from werkzeug.serving import run_simple >>> from werkzeug.testapp import test_app >>> run_simple('localhost', 3000, test_app) * Running on http://localhost:3000/
应用程序显示来自wsgi环境、python解释器和已安装的库的重要信息。
字节、字符串和编码¶
HTTP请求中的值以字节形式表示(或编码为)ASCII。WSGI规范 (PEP 3333 )决定一直使用 str
键入以表示值。为此,使用ISO-8859-1字符集对原始字节进行解码以生成一个字符串。
WSGI环境中的字符串仅限于ISO-8859-1代码点。如果从环境中读取的字符串可能包含该字符集之外的字符,则必须首先将其解码为ISO-8859-1字节,然后使用正确的字符集(通常为UTF-8)编码为字符串。当向环境写入时,则相反。这就是所谓的“WSGI编码舞蹈”。
Werkzeug提供了自动处理这一问题的功能,因此您不需要了解内部工作。同时使用此页面上的函数 EnvironHeaders()
从wsgi环境中读取数据。
应用程序应避免手动创建或修改wsgi环境,除非它们处理正确的编码或解码步骤。Werkzeug中的所有高级接口将根据需要应用编码和解码。
原始请求URI和路径编码¶
这个 PATH_INFO
在环境中是百分比解码后的路径值。例如,原始路径 /hello%2fworld
从wsgi服务器到werkzeug显示为 /hello/world
.这将丢失斜杠是原始字符而不是路径分隔符的信息。
WSGi规范 (PEP 3333 )不提供获取原始值的方法,因此无法在路径中路由某些类型的数据。解决此问题的最兼容方法是以查询字符串而不是路径发送有问题的数据。
但是,许多WSGI服务器都使用原始路径添加了一个非标准的environ key。为了匹配这种行为,Werkzeug的测试客户机和开发服务器将把原始值添加到 REQUEST_URI
和 RAW_URI
钥匙。如果要基于此值路由,可以使用中间件替换 PATH_INFO
在环境中到达应用程序之前。但是,请记住,这些钥匙是非标准的,不能保证存在。