Tornado 非阻塞HTTP服務(wù)器

2022-03-09 11:47 更新

一個(gè)非阻塞的單線程 HTTP 服務(wù)器。

典型的應(yīng)用程序與 ?HTTPServer類幾乎沒有直接交互,除了在進(jìn)程開始時(shí)啟動(dòng)服務(wù)器(甚至通常通過tornado.web.Application.listen間接完成)。

在 4.0 版更改:曾經(jīng)存在于此模塊中的 ?HTTPRequest類已移至 ?tornado.httputil.HTTPServerRequest?。 舊名稱保留為別名。

HTTP服務(wù)器

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)

一個(gè)非阻塞的單線程 HTTP 服務(wù)器。

服務(wù)器由 ?HTTPServerConnectionDelegate ?的子類定義,或者為了向后兼容,使用 ?HTTPServerRequest作為參數(shù)的回調(diào)。 委托通常是一個(gè) ?tornado.web.Application?。

?HTTPServer默認(rèn)支持keep-alive 連接(對于HTTP/1.1 自動(dòng)支持,或者在客戶端請求?Connection: keep-alive時(shí)支持HTTP/1.0)。

如果 ?xheaders為 ?True?,我們支持 ?X-Real-Ip?/?X-Forwarded-For? 和 ?X-Scheme?/?X-Forwarded-Proto? 標(biāo)頭,它們會(huì)覆蓋所有請求的遠(yuǎn)程 IP 和 URI 方案/協(xié)議。 在反向代理或負(fù)載均衡器后面運(yùn)行 Tornado 時(shí),這些表頭很有用。 如果 Tornado 在未設(shè)置受支持的 ?xheaders ?之一的 SSL 解碼代理后面運(yùn)行,則?protocol?參數(shù)也可以設(shè)置為 ?https?。

默認(rèn)情況下,在解析 ?X-Forwarded-For? 標(biāo)頭時(shí),Tornado 將選擇主機(jī)列表中的最后一個(gè)(即最近的)地址作為遠(yuǎn)程主機(jī) IP 地址。 要選擇鏈中的下一個(gè)服務(wù)器,可以將受信任的下游主機(jī)列表作為?trusted_downstream參數(shù)傳遞。 解析 ?X-Forwarded-For? 標(biāo)頭時(shí)將跳過這些主機(jī)。

要使此服務(wù)器為 SSL 流量提供服務(wù),請發(fā)送帶有 ?ssl.SSLContext? 對象的 ?ssl_options? 關(guān)鍵字參數(shù)。 為了與舊版本的 Python 兼容,?ssl_options? 也可能是 ?ssl.wrap_socket? 方法的關(guān)鍵字參數(shù)字典。:

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?:簡單的單進(jìn)程:

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

在許多情況下,可以使用 ?tornado.web.Application.listen? 來避免顯式創(chuàng)建 ?HTTPServer? 的需要。

2、?bind?/?start?:簡單的多進(jìn)程:

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

使用此接口時(shí),不得將 ?IOLoop傳遞給 ?HTTPServer構(gòu)造函數(shù)。 ?start將始終在默認(rèn)單例 ?IOLoop上啟動(dòng)服務(wù)器。

3、?add_sockets?:先進(jìn)的多進(jìn)程:

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

?add_sockets接口更復(fù)雜,但它可以與 ?tornado.process.fork_processes? 一起使用,以便在分叉發(fā)生時(shí)給您更多的靈活性。如果您想以除 ?tornado.netutil.bind_sockets? 之外的其他方式創(chuàng)建偵聽 sockets,則 ?add_sockets? 也可用于單進(jìn)程服務(wù)器。

在 4.0 版更改:添加了 ?decompress_request?、?chunk_size?、?max_header_size?、?idle_connection_timeout?、?body_timeout?、?max_body_size參數(shù)。 添加了對 ?HTTPServerConnectionDelegate實(shí)例作為 ?request_callback的支持。

在 4.1 版更改:?HTTPServerConnectionDelegate.start_request? 現(xiàn)在使用兩個(gè)參數(shù)(?server_conn?,?request_conn?)而不是一個(gè)(?request_conn?)調(diào)用。

在 4.2 版更改:?HTTPServer現(xiàn)在是 ?tornado.util.Configurable? 的子類。

在 4.5 版更改: 添加了?trusted_downstream參數(shù)。

在 5.0 版更改: ?io_loop ?參數(shù)已被刪除。

該類的公共接口主要繼承自 ?TCPServer?,并記錄在該類下。

coroutineclose_all_connections() → None

關(guān)閉所有打開的連接并異步等待它們完成。

此方法與 stop 結(jié)合使用以支持清除關(guān)閉(尤其是對于單元測試)。 典型用法是首先調(diào)用 ?stop()? 停止接受新連接,然后 ?await close_all_connections()? 等待現(xiàn)有連接完成。

此方法當(dāng)前不會(huì)關(guān)閉打開的 websocket 連接。

請注意,此方法是協(xié)程,必須與 ?await一起調(diào)用。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號