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 支援)。如果
xheaders
為True
,則我們支援X-Real-Ip
/X-Forwarded-For
和X-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
上定義)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()
時,您可以多次執行該程式以建立多進程服務。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
之前,任何會接觸到事件循環的程式碼都不能執行。-
server = HTTPServer() server.bind(8888) server.start(0) # Forks multiple sub-processes IOLoop.current().start()
此模式已棄用,因為它需要
asyncio
模組中自 Python 3.10 起已棄用的介面。在 Tornado 未來的版本中,將會移除在start
方法中建立多個進程的支援。
變更於 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
,並在該類別下進行了文件說明。