tornado.httpserver — 非阻塞 HTTP 伺服器

一個非阻塞、單執行緒的 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 支援)。

如果 xheadersTrue,則我們支援 X-Real-Ip/X-Forwarded-ForX-Scheme/X-Forwarded-Proto 標頭,這些標頭會覆寫所有請求的遠端 IP 和 URI 方案/協定。當 Tornado 在反向 Proxy 或負載平衡器後方執行時,這些標頭很有用。如果 Tornado 在不設定任何支援的 xheaders 的 SSL 解碼 Proxy 後方執行,則 protocol 引數也可以設定為 https

預設情況下,當解析 X-Forwarded-For 標頭時,Tornado 會選擇主機清單上的最後一個(即最接近的)位址作為遠端主機 IP 位址。若要選擇鏈中的下一個伺服器,可以將信任的下游主機清單作為 trusted_downstream 引數傳遞。解析 X-Forwarded-For 標頭時,將會跳過這些主機。

若要使此伺服器提供 SSL 流量,請傳送帶有 ssl.SSLContext 物件的 ssl_options 關鍵字引數。為了與舊版 Python 相容,ssl_options 也可能是 ssl.SSLContext.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: 單進程

    async def main():
        server = HTTPServer()
        server.listen(8888)
        await asyncio.Event.wait()
    
    asyncio.run(main())
    

    在許多情況下,可以使用 tornado.web.Application.listen 來避免顯式建立 HTTPServer 的需求。

    雖然此範例本身不會建立多個進程,但是當將 reuse_port=True 參數傳遞給 listen() 時,您可以多次執行該程式以建立多進程服務。

  2. add_sockets:多進程

    sockets = bind_sockets(8888)
    tornado.process.fork_processes(0)
    async def post_fork_main():
        server = HTTPServer()
        server.add_sockets(sockets)
        await asyncio.Event().wait()
    asyncio.run(post_fork_main())
    

    add_sockets 介面更複雜,但是它可以與 tornado.process.fork_processes 一起使用,以執行多進程服務,其中所有工作進程都是從單個父進程分叉而來。add_sockets 也可用於單進程伺服器,如果您想以 bind_sockets 以外的方式建立監聽套接字。

    請注意,當使用此模式時,在 fork_processes 之前,任何會接觸到事件循環的程式碼都不能執行。

  3. bind/start:簡單的 已棄用 多進程

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

    此模式已棄用,因為它需要 asyncio 模組中自 Python 3.10 起已棄用的介面。在 Tornado 未來的版本中,將會移除在 start 方法中建立多個進程的支援。

變更於 4.0 版本: 新增 decompress_requestchunk_sizemax_header_sizeidle_connection_timeoutbody_timeoutmax_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,並在該類別下進行了文件說明。

協程 close_all_connections() None[原始碼]

關閉所有開啟的連線,並異步等待它們完成。

此方法與 stop 結合使用,以支援乾淨的關閉(特別是對於單元測試)。典型的用法是先呼叫 stop() 以停止接受新連線,然後 await close_all_connections() 以等待現有連線完成。

此方法目前不會關閉開啟的 WebSocket 連線。

請注意,此方法是一個協程,必須使用 await 呼叫。