21.22. http.server - Http servers
這個(gè)模塊定義了用以實(shí)現(xiàn)HTTP servers(Web servers)的類(lèi)。
HTTPServer是一個(gè)socketserver.TCPServer的子類(lèi)。這個(gè)類(lèi)創(chuàng)建HTTP socket并監(jiān)聽(tīng)感挥,將請(qǐng)求分發(fā)給handler炊邦。創(chuàng)建并運(yùn)行一個(gè)server的代碼是下面這樣的:
def run(server_class=HTTPServer,handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
class http.server.HTTPServer(server_address, RequestHandlerClass)
這個(gè)類(lèi)基于TCPServer實(shí)現(xiàn)嚎尤,將server地址以名為server_name和server_port的實(shí)例變量存儲(chǔ)瓤逼。通過(guò)handler的名為server實(shí)例變量礼华,這個(gè)server可以被handler訪問(wèn)勺馆。
<code>HTTPServer</code>初始化時(shí)必須被提供一個(gè)<code>RequestHandlerClass</code>戏售。這個(gè)模塊為<code>HTTPServer</code>提供了三個(gè)不同的變體:
class http.server.BaseHTTPRequestHandler(request, client_address, server)
這個(gè)類(lèi)被用來(lái)處理到達(dá)server的HTTP請(qǐng)求。它自己不能響應(yīng)任何HTTP請(qǐng)求草穆;它必須被繼承才能處理每個(gè)請(qǐng)求方法(例如GET或者POST)灌灾。<code> BaseHTTPRequestHandler</code>提供了一定數(shù)量的類(lèi)變量和實(shí)例變量,和一些被子類(lèi)使用的方法悲柱。
這個(gè)handler會(huì)解析http請(qǐng)求和headers锋喜,然后調(diào)用對(duì)應(yīng)于請(qǐng)求類(lèi)型的方法去處理。方法名是從HTTP請(qǐng)求構(gòu)造出的豌鸡。例如嘿般,對(duì)于請(qǐng)求方法SPAM,<code>do_SPAM()</code>方法將會(huì)被調(diào)用涯冠,不傳入任何參數(shù)炉奴。所有的相關(guān)信息都存儲(chǔ)在這個(gè)handler實(shí)例變量中。子類(lèi)應(yīng)當(dāng)不需要去覆蓋或者擴(kuò)展<code>__init__()</code>方法蛇更。
<code>BaseHTTPRequestHandler</code>擁有下面這些實(shí)例變量:
client_address
包含了一個(gè)(host,port)格式的元組瞻赶,表示client的地址。
server
包含了server實(shí)例派任。
close_connection
布爾值砸逊,應(yīng)當(dāng)在handle_onr_request()返回前被設(shè)置,來(lái)指出是否應(yīng)該處理下一個(gè)請(qǐng)求掌逛,或者關(guān)閉這個(gè)連接痹兜。
requestline
包含了字符串表示的HTTP請(qǐng)求內(nèi)容。作為終止的CRLF被去掉了颤诀。這個(gè)屬性應(yīng)該被handle_one_request()設(shè)置字旭。如果沒(méi)有有效的內(nèi)容,它應(yīng)當(dāng)被設(shè)置為空值崖叫。
command
包含了請(qǐng)求類(lèi)型遗淳,比如,‘GET’心傀。
path
包含了請(qǐng)求路徑屈暗。
request_version
包含了請(qǐng)求的版本信息。比如,'HTTP/1.0'养叛。
headers
維持一個(gè)被名為MessageClass類(lèi)變量指定的類(lèi)的實(shí)例种呐。這個(gè)實(shí)例解析并管理請(qǐng)求中的headers信息。headers信息由http.client中的parse_headers解析弃甥,這個(gè)方法要求請(qǐng)求提供一個(gè)可用的RFC 2822規(guī)定的header爽室。
rfile
包含了一個(gè)輸入流,定位于可選的輸入信息的開(kāi)始位置淆攻。
wfile
包含了用于寫(xiě)入返回?cái)?shù)據(jù)的流阔墩。寫(xiě)入時(shí)應(yīng)當(dāng)遵守HTTP協(xié)議。
<code>BaseHTTPRequestHandler</code>擁有如下類(lèi)變量:
server_version
指定了服務(wù)器程序的版本瓶珊。你可能希望重載它啸箫。格式是多個(gè)空格分割的字符串,其中的每個(gè)字符串都是name[/version]格式伞芹,比如忘苛,‘BaseHTTP/0.2’
sys_version
包含了Python的版本信息,格式和version_string以及server_version類(lèi)變量使用的相同唱较,比如扎唾,‘Python/1.4’。
error_message_format
指定了用來(lái)生成返回給客戶端的錯(cuò)誤信息的格式绊汹。(后面的看不懂稽屏。扮宠。西乖。)
error_content_type
指定了用于返回錯(cuò)誤的HTTP header中的Content-Type。默認(rèn)值是'text/html'坛增。
protocol_version
這個(gè)變量指定了回復(fù)請(qǐng)求的HTTP的協(xié)議版本获雕。如果被設(shè)置為'HTTP/1.1',server會(huì)允許持久鏈接收捣。然而届案,你的server必須在對(duì)client的所有請(qǐng)求中包含一個(gè)恰當(dāng)?shù)腃ontent-Length header(使用send_header())。為了向后兼容罢艾,這個(gè)設(shè)置的默認(rèn)值是'HTTP/1.0'楣颠。
MessageClass
指定了一個(gè)像email.message.Message的類(lèi)用以解析HTTP headers。一般來(lái)說(shuō)咐蚯,它沒(méi)被重載童漩,默認(rèn)值是http.client.HTTPMessage.
responses
這個(gè)變量包含了一個(gè)從錯(cuò)誤碼到錯(cuò)誤信息的長(zhǎng)短版本的映射。比如春锋,{code: (shortmessage, longmessage)}矫膨。短消息通常被用于作為錯(cuò)誤回復(fù)中的消息內(nèi)容,長(zhǎng)消息用于解釋(參見(jiàn)error_message_format類(lèi)變量)。
<code>BaseHTTPRequestHandler</code>擁有如下方法:
handle()
調(diào)用handler_one_request()一次(如果可以使用持久鏈接侧馅,多次)來(lái)處理到來(lái)的HTTP請(qǐng)求危尿。你應(yīng)該永遠(yuǎn)都不需要重載它。作為替代馁痴,實(shí)現(xiàn)一個(gè)恰當(dāng)?shù)膁o_*()方法谊娇。
handle_one_request()
這個(gè)方法會(huì)將請(qǐng)求解析并分發(fā)到合適的do_*()方法。你應(yīng)該永遠(yuǎn)都不需要重載它弥搞。
handler_expect_100()
當(dāng)一個(gè)支持HTTP/1.1的server接收到一個(gè)包含Expect: 100-continue header的請(qǐng)求的時(shí)候邮绿,它返回一個(gè)100 Continue的header,接著是一個(gè)200 OK的header攀例。這個(gè)方法可以被重載船逮,以便于在server不像讓client continue的時(shí)候引發(fā)一個(gè)錯(cuò)誤。比如粤铭,server可以選擇發(fā)送417 Expectation Failed作為返回頭然后返回一個(gè)False挖胃。
send_error(code, message=None, explain=None)
發(fā)送并且記錄一個(gè)完成的錯(cuò)誤返回。code數(shù)字制定了HTTP錯(cuò)誤碼碼梆惯,和一個(gè)可選的易于閱讀的短消息涌來(lái)描述error酱鸭。explain變量可以被用來(lái)提供關(guān)于這個(gè)error的更詳細(xì)的信息。它會(huì)被類(lèi)變量error_message_format制定的格式格式化垛吗,同時(shí)在header發(fā)出之后作為body返回凹髓。類(lèi)變量responses保存了message和explain的默認(rèn)值。對(duì)于未知的code怯屉,這兩個(gè)字符串的默認(rèn)值都是???蔚舀。