tornado.httpserver — Non-blocking HTTP server

非阻塞单线程HTTP服务器.

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

在版本4.0中进行了更改:此模块中的HTTPRequest类已移至tornado.httputil.HTTPServerRequest . 旧名称保留为别名.

HTTP Server

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: str = None, decompress_request: bool = False, chunk_size: int = None, max_header_size: int = None, idle_connection_timeout: float = None, body_timeout: float = None, max_body_size: int = None, max_buffer_size: int = None, trusted_downstream: List[str] = None)[source]

非阻塞单线程HTTP服务器.

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

默认情况下, HTTPServer支持保持连接(自动为HTTP / 1.1或当客户端请求Connection: keep-alive时自动为HTTP / 1.0).

如果xheadersTrue ,则我们支持X-Real-Ip / X-Forwarded-ForX-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以外的其他方式创建监听套接字,则add_sockets也可以在单进程服务器中使用.

在版本4.0中更改: Added decompress_request, chunk_size, max_header_size, idle_connection_timeout, body_timeout, max_body_size arguments. Added support for HTTPServerConnectionDelegate instances as request_callback.

在版本4.1中进行了更改: HTTPServerConnectionDelegate.start_request现在使用两个参数(server_conn, request_conn)根据文档) (server_conn, request_conn) )而不是一个(request_conn)调用.

在版本4.2中进行了更改: HTTPServer现在是tornado.util.Configurable的子类.

在版本4.5中更改:添加了trusted_downstream参数.

在版本5.0中更改: io_loop参数已删除.

此类的公共接口主要从TCPServer继承,并在该类下进行记录.