http.server - Http servers

21.22. http.server - Http servers

源碼:Lib/http/server.py

這個(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)值都是???蔚舀。

未完待續(xù)。锨络。赌躺。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羡儿,隨后出現(xiàn)的幾起案子礼患,更是在濱河造成了極大的恐慌,老刑警劉巖掠归,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缅叠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡虏冻,警方通過(guò)查閱死者的電腦和手機(jī)肤粱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兄旬,“玉大人狼犯,你說(shuō)我怎么就攤上這事余寥。” “怎么了悯森?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵宋舷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓢姻,道長(zhǎng)祝蝠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任幻碱,我火速辦了婚禮绎狭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褥傍。我一直安慰自己儡嘶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布恍风。 她就那樣靜靜地躺著蹦狂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朋贬。 梳的紋絲不亂的頭發(fā)上凯楔,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音锦募,去河邊找鬼摆屯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糠亩,可吹牛的內(nèi)容都是我干的虐骑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼削解,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼富弦!你這毒婦竟也來(lái)了沟娱?” 一聲冷哼從身側(cè)響起氛驮,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎济似,沒(méi)想到半個(gè)月后矫废,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砰蠢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年蓖扑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片台舱。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡律杠,死狀恐怖潭流,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柜去,我是刑警寧澤灰嫉,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嗓奢,受9級(jí)特大地震影響讼撒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜股耽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一根盒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧物蝙,春花似錦炎滞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至丽惭,卻和暖如春击奶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背责掏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工柜砾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人换衬。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓痰驱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瞳浦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子担映,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)叫潦,斷路器蝇完,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 本文依照 知識(shí)共享許可協(xié)議(署名-非商業(yè)性使用-禁止演繹) 發(fā)布。 編寫(xiě)HTTP 服務(wù)器與客戶端 Vert.x讓編...
    半枚荔枝閱讀 3,948評(píng)論 0 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法矗蕊,類(lèi)相關(guān)的語(yǔ)法短蜕,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法傻咖,異常的語(yǔ)法朋魔,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,581評(píng)論 18 399
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 接近失去的狀態(tài)真的好難受 一種特別心痛 生理的難受壓制不住心里的難受
    Ccit閱讀 170評(píng)論 0 0