Python-SWGI服務(wù)器搭建及基礎(chǔ)解析

1.了解SWGI

一個Web應(yīng)用的本質(zhì)就是:

  1. 瀏覽器發(fā)送一個HTTP請求娇未;
  2. 服務(wù)器收到請求淫僻,生成一個HTML文檔;
  3. 服務(wù)器把HTML文檔作為HTTP響應(yīng)的Body發(fā)送給瀏覽器蛛芥;
  4. 瀏覽器收到HTTP響應(yīng)商膊,從HTTP Body取出HTML文檔并顯示。
20180819225952712.png

所以,最簡單的Web應(yīng)用就是先把HTML用文件保存好规脸,用一個現(xiàn)成的HTTP服務(wù)器軟件坯约,接收用戶請求,從文件中讀取HTML莫鸭,返回闹丐。Apache、Nginx被因、Lighttpd等這些常見的靜態(tài)服務(wù)器就是干這件事情的卿拴。

如果要動態(tài)生成HTML,就需要把上述步驟自己來實現(xiàn)梨与。不過堕花,接受HTTP請求、解析HTTP請求粥鞋、發(fā)送HTTP響應(yīng)都是苦力活缘挽,如果我們自己來寫這些底層代碼,還沒開始寫動態(tài)HTML呢呻粹,就得花個把月去讀HTTP規(guī)范壕曼。

正確的做法是底層代碼由專門的服務(wù)器軟件實現(xiàn),我們用Python專注于生成HTML文檔等浊。因為我們不希望接觸到TCP連接腮郊、HTTP原始請求和響應(yīng)格式,所以筹燕,需要一個統(tǒng)一的接口轧飞,讓我們專心用Python編寫Web業(yè)務(wù)

這個接口就是WSGI:Web Server Gateway Interface

image.png
from  wsgiref.simple_server import make_server,demo_app
# 提供兩個必須變量
def app(environ,start_response):
    # 調(diào)用start_response發(fā)送頭部
    from io import StringIO
    #StringIO 把字符串緩存在內(nèi)存中,操作函數(shù)與文件操作基本相同
    stdout = StringIO()
    # stdout.write('浪里個浪')
    # 把字符串輸出到文件中
    print("Hello world撒踪,你大爺?shù)?", file=stdout)
    h = sorted(environ.items())
    for k, v in h:
        print(k, '=', repr(v), file=stdout)
    #  響應(yīng)http響應(yīng)函數(shù)   
    start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
    #  stdout 獲取內(nèi)存中緩存的全部字符串
    return [stdout.getvalue().encode("utf-8")]
# 創(chuàng)建服務(wù)器對象 ip地址  端口號  處理http響應(yīng)函數(shù)
server = make_server('0.0.0.0',9000,app)

# 啟動服務(wù)器
server.serve_forever()

make_server()函數(shù):
第一個參數(shù):host 地址
第二個參數(shù):端口號
第三個參數(shù):可調(diào)用對象

  • 接收兩個必選參數(shù)environ过咬、start_response,以及一個可選參數(shù)exc_info制妄。參數(shù)名不是固定的援奢,這就意味著你必須使用位置參數(shù)而非關(guān)鍵字參數(shù)(這應(yīng)該是用來約束wsgi服務(wù)器的)
  • environ存放CGI規(guī)定的變量一及別的變量。
  • start_response 是一個可調(diào)用對象忍捡,通過類似start_response('200 OK',[('Content-Type','text/html'))來發(fā)送http的響應(yīng)的頭部集漾。
  • exc_info 只有start_response()被錯誤處理程序調(diào)用時,這個參數(shù)才會提供砸脊,并且是有應(yīng)用對象提供具篇。
    返回值是字節(jié)類型的元組,用來表示http body

start_response 函數(shù):
發(fā)送了HTTP響應(yīng)的Header凌埂,注意Header只能發(fā)送一次驱显,也就是只能調(diào)用一次start_response()函數(shù)。start_response()函數(shù)接收兩個參數(shù),一個是HTTP響應(yīng)碼埃疫,一個是一組list表示的HTTP Header伏恐,每個Header用一個包含兩個str的tuple表示。

app函數(shù)return的返回值將作為HTTP響應(yīng)的Body發(fā)送給瀏覽器栓霜。
注意:return app函數(shù)的返回值之前翠桦,必須調(diào)用start_response 把HTTP響應(yīng)的Header返回出去。

無論多么復(fù)雜的Web應(yīng)用程序胳蛮,入口都是一個WSGI處理函數(shù)销凑。HTTP請求的所有輸入信息都可以通過environ獲得,HTTP響應(yīng)的輸出都可以通過start_response()加上函數(shù)返回值作為Body仅炊。

可調(diào)用對象的通過類的實現(xiàn)方式:

class App:
   def __call__(self,environ,start_response):
       start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
       body = '你是豬嗎'
       for i, j in environ.items():
           body += '<p>' + (str(i) + ':::::' + str(j) + '<br><p>')
       return [body.encode('utf-8')]

app = App()

# 創(chuàng)建服務(wù)器對象 ip地址  端口號  處理http響應(yīng)函數(shù)
server = make_server('0.0.0.0',9000,app)

# 啟動服務(wù)器
server.serve_forever()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斗幼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抚垄,更是在濱河造成了極大的恐慌蜕窿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆馁,死亡現(xiàn)場離奇詭異桐经,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)智哀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門次询,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荧恍,“玉大人瓷叫,你說我怎么就攤上這事∷脱玻” “怎么了摹菠?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骗爆。 經(jīng)常有香客問我次氨,道長,這世上最難降的妖魔是什么摘投? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任煮寡,我火速辦了婚禮,結(jié)果婚禮上犀呼,老公的妹妹穿的比我還像新娘幸撕。我一直安慰自己,他們只是感情好外臂,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布坐儿。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪貌矿。 梳的紋絲不亂的頭發(fā)上炭菌,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機(jī)與錄音逛漫,去河邊找鬼黑低。 笑死,一個胖子當(dāng)著我的面吹牛尽楔,可吹牛的內(nèi)容都是我干的投储。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阔馋,長吁一口氣:“原來是場噩夢啊……” “哼玛荞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呕寝,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勋眯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后下梢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體客蹋,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年孽江,在試婚紗的時候發(fā)現(xiàn)自己被綠了讶坯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡岗屏,死狀恐怖辆琅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情这刷,我是刑警寧澤婉烟,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站暇屋,受9級特大地震影響似袁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咐刨,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一昙衅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧定鸟,春花似錦而涉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟹但。三九已至,卻和暖如春谭羔,著一層夾襖步出監(jiān)牢的瞬間华糖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工瘟裸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留客叉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓话告,卻偏偏與公主長得像兼搏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沙郭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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