Python Tornado入门教程 Tornado 非阻塞HTTP服务器

2024-02-25 开发教程 Python Tornado入门教程 匿名 0

一个非阻塞的单线程 HTTP 服务器。

典型的应用程序与 ​HTTPServer类几乎没有直接交互,除了在进程开始时启动服务器(甚至通常通过tornado.web.Application.listen间接完成)。

在 4.0 版更改:曾经存在于此模块中的 ​HTTPRequest类已移至 ​tornado.httputil.HTTPServerRequest​。 旧名称保留为别名。

HTTP服务器

class tornado.httpserver.HTTPServer(request_callback: Union[httputil.HTTPServerConnectionDelegate, Callable[[httputil.HTTPServerRequest], None]], no_keep_alive: bool = False, xheaders: bool = False, ssl_options: Union[Dict[str, Any], ssl.SSLContext] = None, protocol: Optional[str] = None, decompress_request: bool = False, chunk_size: Optional[int] = None, max_header_size: Optional[int] = None, idle_connection_timeout: Optional[float] = None, body_timeout: Optional[float] = None, max_body_size: Optional[int] = None, max_buffer_size: Optional[int] = None, trusted_downstream: Optional[List[str]] = None)

一个非阻塞的单线程 HTTP 服务器。

服务器由 ​HTTPServerConnectionDelegate ​的子类定义,或者为了向后兼容,使用 ​HTTPServerRequest作为参数的回调。 委托通常是一个 ​tornado.web.Application​。

HTTPServer默认支持keep-alive 连接(对于HTTP/1.1 自动支持,或者在客户端请求​Connection: keep-alive时支持HTTP/1.0)。

如果 ​xheaders为 ​True​,我们支持 ​X-Real-Ip​/​X-Forwarded-For​ 和 ​X-Scheme​/​X-Forwarded-Proto​ 标头,它们会覆盖所有请求的远程 IP 和 URI 方案/协议。 在反向代理或负载均衡器后面运行 Tornado 时,这些表头很有用。 如果 Tornado 在未设置受支持的 ​xheaders ​之一的 SSL 解码代理后面运行,则​protocol​参数也可以设置为 ​https​。

默认情况下,在解析 ​X-Forwarded-For​ 标头时,Tornado 将选择主机列表中的最后一个(即最近的)地址作为远程主机 IP 地址。 要选择链中的下一个服务器,可以将受信任的下游主机列表作为​trusted_downstream参数传递。 解析 ​X-Forwarded-For​ 标头时将跳过这些主机。

要使此服务器为 SSL 流量提供服务,请发送带有 ​ssl.SSLContext​ 对象的 ​ssl_options​ 关键字参数。 为了与旧版本的 Python 兼容,​ssl_options​ 也可能是 ​ssl.wrap_socket​ 方法的关键字参数字典。:

ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"),
os.path.join(data_dir, "mydomain.key"))
HTTPServer(application, ssl_options=ssl_ctx)

HTTPServer初始化遵循以下三种模式之一(初始化方法在 ​tornado.tcpserver.TCPServer​ 上定义):

1、​listen​:简单的单进程:

server = HTTPServer(app)
server.listen(8888)
IOLoop.current().start()

在许多情况下,可以使用 ​tornado.web.Application.listen​ 来避免显式创建 ​HTTPServer​ 的需要。

2、​bind​/​start​:简单的多进程:

server = HTTPServer(app)
server.bind(8888)
server.start(0) # Forks multiple sub-processes
IOLoop.current().start()

使用此接口时,不得将 ​IOLoop传递给 ​HTTPServer构造函数。 ​start将始终在默认单例 ​IOLoop上启动服务器。

3、​add_sockets​:先进的多进程:

sockets = tornado.netutil.bind_sockets(8888)
tornado.process.fork_processes(0)
server = HTTPServer(app)
server.add_sockets(sockets)
IOLoop.current().start()

add_sockets接口更复杂,但它可以与 ​tornado.process.fork_processes​ 一起使用,以便在分叉发生时给您更多的灵活性。如果您想以除 ​tornado.netutil.bind_sockets​ 之外的其他方式创建侦听 sockets,则 ​add_sockets​ 也可用于单进程服务器。

在 4.0 版更改:添加了 ​decompress_request​、​chunk_size​、​max_header_size​、​idle_connection_timeout​、​body_timeout​、​max_body_size参数。 添加了对 ​HTTPServerConnectionDelegate实例作为 ​request_callback的支持。

在 4.1 版更改:​HTTPServerConnectionDelegate.start_request​ 现在使用两个参数(​server_conn​,​request_conn​)而不是一个(​request_conn​)调用。

在 4.2 版更改:​HTTPServer现在是 ​tornado.util.Configurable​ 的子类。

在 4.5 版更改: 添加了​trusted_downstream参数。

在 5.0 版更改: ​io_loop ​参数已被删除。

该类的公共接口主要继承自 ​TCPServer​,并记录在该类下。

coroutineclose_all_connections() → None

关闭所有打开的连接并异步等待它们完成。

此方法与 stop 结合使用以支持清除关闭(尤其是对于单元测试)。 典型用法是首先调用 ​stop()​ 停止接受新连接,然后 ​await close_all_connections()​ 等待现有连接完成。

此方法当前不会关闭打开的 websocket 连接。

请注意,此方法是协程,必须与 ​await一起调用。