gevent.pywsgi --纯python、gevent友好的wsgi服务器

一个纯Python、Gevent友好的WSGI服务器。

服务器提供在 WSGIServer 但是大多数实际的WSGi工作都是由 WSGIHandler ---为每个请求创建一个新实例。服务器可以定制为使用 WSGIHandler .

class Environ[源代码]

基类:dict

可用于wsgi环境对象的基类。

临时API。

1.2a1 新版功能.

copy() a shallow copy of D[源代码]
class LoggingLogAdapter(logger, level=20)[源代码]

基类:object

的适配器 logging.Logger 允许它们与之一起使用的实例 WSGIServer .

警告

除非整个过程在生命周期的早期阶段(在配置日志之前)进行了猴修补,否则日志记录程序可能不会是gevent合作的。例如,socket和syslog处理程序以一种可以阻塞的方式使用socket模块,大多数处理程序获取线程锁。

警告

may 可以在 gevent.Hub 格林莱特。在集线器greenlet中运行的代码在不触发 LoopExit .

1.1a3 新版功能.

在 1.1b6 版更改: 此对象上不存在的属性被代理到基础记录器实例。这允许使用自定义 Logger 子类(甚至是duck类型的对象)。

在 1.1 版更改: 删除传递给的消息的尾随换行符 write() 因为日志处理程序通常会自己添加一个。

将信息写入 记录器 在给定的 水平 (默认为信息)。

flush()[源代码]

无操作;必须是类似文件的对象

class SecureEnviron[源代码]

基类:gevent.pywsgi.Environ

默认情况下不打印其键和值的环境。

临时API。

这是为了防止潜在的敏感信息,如HTTP授权和cookie被无意中打印或记录。

对于调试,每个实例都可以 secure_repr 属性设置为 False 这会使它像正常的听写一样打印。

什么时候? secure_reprTrue (默认值),然后 whitelist_keys 查询属性;如果该值为true ish,则它应该是一个容器(响应 in )键名称(通常是列表或集合)。此字典中位于 whitelist_keys 然后将打印,而所有其他值将被屏蔽。这些值可以通过设置 default_secure_reprdefault_whitelist_keys ,分别为:

>>> environ = SecureEnviron(key='value')
>>> environ 
<pywsgi.SecureEnviron dict (keys: 1) at ...

如果我们将密钥白名单,它将被打印出来:

>>> environ.whitelist_keys = {'key'}
>>> environ
{'key': 'value'}

非白名单密钥( only ,以避免doctest问题)被屏蔽:

>>> environ['secure'] = 'secret'; del environ['key']
>>> environ
{'secure': '<MASKED>'}

我们可以完全关闭它,例如:

>>> environ.secure_repr = False
>>> environ
{'secure': 'secret'}

我们也可以在类级别对其进行自定义(这里我们使用一个新的类来显式化并避免污染真正的默认值;我们将把这个类设置为 environ_class 服务器的)::

>>> class MyEnviron(SecureEnviron):
...    default_whitelist_keys = ('key',)
...
>>> environ = MyEnviron({'key': 'value'})
>>> environ
{'key': 'value'}

1.2a1 新版功能.

class WSGIHandler(sock, address, server, rfile=None)[源代码]

基类:object

处理来自套接字的HTTP请求,创建wsgi环境,并与wsgi应用程序交互。

这是默认值 WSGIServer.handler_class . 这个类可以被小心地子类化,并且该类设置在 WSGIServer 在构造时通过关键字参数进行实例。

实例的构造参数与传递给服务器的参数相同 WSGIServer.handle() 方法,然后是服务器本身。应用程序和环境是从服务器获取的。

ApplicationError

alias of AssertionError

get_environ()[源代码]

为特定请求构造并返回新的WSGi环境字典。

这应该从向服务器询问基本环境开始,使用 WSGIServer.get_environ() ,然后继续添加请求特定的值。

在调用此方法时,请求行和请求应已被解析,并且 self.headers 应填充。

handle()[源代码]

由服务器调用的主请求处理方法。

此方法运行一个请求处理循环,调用 handle_one_request() 直到处理完连接上的所有请求(也就是说,它实现了保持活动状态)。

handle_one_request()[源代码]

使用处理一个HTTP请求 self.socketself.rfile .

此方法的每次调用都将执行若干操作,包括(但不限于):

有几个可能的返回值指示客户端连接的状态:

  • None

    客户端连接已经关闭,或者应该关闭,因为wsgi应用程序或客户端设置了 Connection: close 标题。请求处理循环应该终止并执行清理步骤。

  • (状态,正文)

    HTTP状态和主体元组。根据状态和主体的详细信息,请求出错。请求处理循环应该终止、关闭连接并执行清理步骤。注意, body 是要发送到客户端的完整内容,包括所有头和初始状态行。

  • True

    文字 True 值。请求已成功处理,响应由发送到客户端 handle_one_response() . 连接保持打开状态以处理更多请求,连接处理循环应再次调用此方法。这是典型的返回值。

参见

handle()

在 1.1b6 版更改: 漏斗异常与通过的无效HTTP请求有关 _handle_client_error() 允许子类自定义。注意这是实验性的,将来可能会改变。

handle_one_response()[源代码]

调用应用程序以生成一个响应。

这是由 handle_one_request() 请求的所有状态建立之后。它负责错误处理。

read_request(raw_requestline)[源代码]

分析传入的请求。

将各种头解析为 self.headers 使用 MessageClass . 成功返回此方法时设置的其他属性包括 self.content_lengthself.close_connection .

参数

raw_requestline (str) -- 土生土长的 str 表示请求行。此的已处理版本将存储到 self.requestline .

引发

ValueError -- 如果请求无效。此错误不会作为回溯记录(因为它是客户端问题,而不是服务器问题)。

返回

指示请求是否已成功分析的布尔值。此方法应返回一个真值,或者引发了一个ValueError,其中包含有关分析错误的详细信息。

在 1.1b6 版更改: 提出以前记录的 ValueError 在更多情况下,而不是返回一个错误的值;这允许子类有更多的机会自定义行为。

read_requestline()[源代码]

读取并返回HTTP请求行。

在python 2和3下,这应该返回本机 str 在python 3下,这可能意味着需要对从网络中读取的字节进行解码(使用iso-8859-1字符集,也就是拉丁语-1)。

start_response(status, headers, exc_info=None)[源代码]

在 1.2a1 版更改: 通过引发 ValueError 如果 地位 或任何 页眉 名称或值包含回车或换行符。

在 1.1b5 版更改: 在此方法期间,主动处理状态行和头的编码检查。在python 2上,避免一些额外的编码。

ignored_socket_errors = (32, 104)

这些错误被 handle_one_response() 以避免在正常操作条件下产生过多的日志条目。它们表示远程客户机已断开连接,并且此过程几乎没有或什么也没有。您可以在子类中更改此值。

默认值包括 errno.EPIPEerrno.ECONNRESET . 在Windows上,还包括 errno.WSAECONNABORTED .

这是临时API,可能会有更改。见 pull request #377pull request #999issue #136 .

1.3 新版功能.

class WSGISecureEnviron[源代码]

基类:gevent.pywsgi.SecureEnviron

专用于一些常见的wsgi变量的白名单键的默认列表。

例子::

>>> environ = WSGISecureEnviron(REMOTE_ADDR='::1', HTTP_AUTHORIZATION='secret')
>>> environ
{'REMOTE_ADDR': '::1', (hidden keys: 1)}
>>> import pprint
>>> pprint.pprint(environ)
{'REMOTE_ADDR': '::1', (hidden keys: 1)}
>>> print(pprint.pformat(environ))
{'REMOTE_ADDR': '::1', (hidden keys: 1)}
class WSGIServer(listener, application=None, backlog=None, spawn='default', log='default', error_log='default', handler_class=None, environ=None, **ssl_args)[源代码]

基类:gevent.server.StreamServer

基于 StreamServer 支持HTTPS。

参数
  • log -- 如果给定,则对象具有 write 写入请求(访问)日志的方法。如果未给出,则默认为 sys.stderr . 你可以通过 None 禁用请求日志记录。您可以使用包装,例如, logging ,以支持不实现 write 方法。(如果您通过 Logger 例如,或者一般来说,提供 log 方法,但不是 write 方法,这样的包装将自动创建,并将在 INFO 水平。)

  • error_log -- 如果给定,一个类似文件的对象 writewritelinesflush 将写入错误日志的方法。如果未给出,则默认为 sys.stderr . 你可以通过 None 禁用错误日志记录(不推荐)。您可以使用包装,例如, logging ,以支持未实现正确方法的对象。此参数将成为 wsgi.errors 在wsgi环境中(如果尚未设置)。(与 log ,包装 Logger 实例等将自动创建并登录到 ERROR 水平。)

参见

LoggingLogAdapter

在尝试使用之前,请参阅重要警告 logging .

在 1.1a3 版更改: 增加了 error_log 参数,并设置 wsgi.errors 在wsgi环境中设置为该值。

在 1.1a3 版更改: 添加传球支持 logging.Logger 对象到 logerror_log 争论。

在 20.6.0 版更改: 通过A handle 对于构造函数的kwarg现在已被正式弃用。

environ_class

alias of dict

handler_class

接受三个参数(socket、address、server)并返回带有 handle() 方法。对每个传入的套接字请求调用一次Callable,其handle方法也是如此。直到套接字的所有使用都完成之后,才应返回handle方法。

这个类使用 WSGIHandler 对象作为默认值。您可以子类化这个类并设置一个不同的默认值,或者传递一个要在 handler_class 关键字构造函数参数。

alias of gevent.pywsgi.WSGIHandler

secure_environ_class

alias of gevent.pywsgi.WSGISecureEnviron

handle(sock, address)[源代码]

创建的实例 handler_class 处理请求。

此方法将一直阻塞,直到处理程序返回。

init_socket()[源代码]

如果用户使用地址而不是套接字初始化服务器,则此函数必须创建一个套接字,绑定它,并将其置于侦听模式。

它不应该由用户调用,而是由 start() 在开始接受循环之前。

update_environ()[源代码]

在处理第一个请求之前调用以填充wsgi环境值。

这包括获取正确的服务器名称和端口。

error_log = None

将写入错误日志的对象。决不能没有。从初始化 error_log 构造函数参数。

log = None

将写入请求日志的对象。决不能没有。从初始化 log 构造函数参数。

Next page: gevent.server --TCP/SSL服务器