中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

使用Python搭建http服務(wù)器

David Wheeler有一句名言:“計(jì)算機(jī)科學(xué)中的任何問題,都可以通過加上另一層間接的中間層解決?!睘榱颂岣逷ython網(wǎng)絡(luò)服務(wù)的可移植性,Python社區(qū)在PEP 333中提出了Web服務(wù)器網(wǎng)關(guān)接口(WSGI,Web Server Gateway Interface)。

為了提高Python網(wǎng)絡(luò)服務(wù)的可移植性,Python社區(qū)在PEP 333中提出了Web服務(wù)器網(wǎng)關(guān)接口(WSGI,Web Server Gateway Interface)。
WSGL標(biāo)準(zhǔn)就是添加了一層中間層。通過這一個(gè)中間層,用Python編寫的HTTP服務(wù)就能夠與任何Web服務(wù)器進(jìn)行交互了?,F(xiàn)在,WSGI已經(jīng)成為了使用Python進(jìn)行HTTP操作的標(biāo)準(zhǔn)方法。
按照標(biāo)準(zhǔn)的定義,WSGI應(yīng)用程序是可以被調(diào)用的,并且有兩個(gè)輸入?yún)?shù)。

成都創(chuàng)新互聯(lián)公司主營覃塘網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,覃塘h5微信小程序開發(fā)搭建,覃塘網(wǎng)站營銷推廣歡迎覃塘等地區(qū)企業(yè)咨詢

1、WSGI

下面是第一段代碼,第一個(gè)參數(shù)是environ,用于接收一個(gè)字典,字典中提供的鍵值對是舊式的CGI環(huán)境集合的拓展。第二個(gè)參數(shù)本身也是可以被調(diào)用的,習(xí)慣上會(huì)將其命名為start_response(),WSGI應(yīng)用程序通過這個(gè)參數(shù)來聲明響應(yīng)頭信息。
# 用WSGI應(yīng)用形式編寫的簡單HTTP服務(wù)。

#!/usr/bin/env?python3?
#?A?simple?HTTP?service?built?directly?against?the?low-level?WSGI?spec.?
?
from?pprint?import?pformat?
from?wsgiref.simple_server?import?make_server?
?
def?app(environ,?start_response):?
????headers?=?{'Content-Type':?'text/plain;?charset=utf-8'}?
????start_response('200?OK',?list(headers.items()))?
????yield?'Here?is?the?WSGI?environment:?
?
'.encode('utf-8')?
????yield?pformat(environ).encode('utf-8')?
?
if?__name__?==?'__main__':?
????httpd?=?make_server('',?8000,?app)?
????host,?port?=?httpd.socket.getsockname()?
????print('Serving?on',?host,?'port',?port)?
????httpd.serve_forever()

上述只是一個(gè)簡單的情況。但是在編寫服務(wù)器程序時(shí),復(fù)雜度就大大提升了。這是因?yàn)橐耆紤]標(biāo)準(zhǔn)中的描述的許多注意點(diǎn)和邊界情況。

2、前向代理與反向代理

無論前向代理還是反向代理,HTTP代理其實(shí)就是一個(gè)HTTP服務(wù)器,用于接收請求,然后對接收到的請求(至少是部分請求)進(jìn)行轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)請求時(shí)代理會(huì)扮演客戶端的角色,將轉(zhuǎn)發(fā)的HTTP請求發(fā)送至真正的服務(wù)器,最后將從服務(wù)器接受到的響應(yīng)發(fā)揮扮演客戶端的角色,將轉(zhuǎn)發(fā)的請求發(fā)送至真正的服務(wù)器,最后將從服務(wù)器接受到的響應(yīng)發(fā)回給最初的客戶端。
下面是前向代理和反向代理的簡圖。
使用Python搭建http服務(wù)器
反向代理已經(jīng)廣泛應(yīng)用于大型的HTTP服務(wù)當(dāng)中。反向代理是Web服務(wù)的一部分,對于HTTP客戶端并不可見。

3、四種架構(gòu)

架構(gòu)師一般都使用很多種復(fù)雜的機(jī)制來將多個(gè)子模塊組合建成一個(gè)HTTP服務(wù)?,F(xiàn)在在Python社區(qū)中,已經(jīng)形成了4種基本的模式。如果已經(jīng)編寫了用于生成動(dòng)態(tài)內(nèi)容的Python代碼,并且已經(jīng)選擇了某個(gè)支持WSGI的API或框架,應(yīng)該如何將HTTP服務(wù)部署到線上呢?

運(yùn)行一個(gè)使用Python編寫的服務(wù)器,服務(wù)器的代碼中可以直接調(diào)用WSGI接口?,F(xiàn)在最流行的是Green Unicorn(Gunicorn)服務(wù)器,不過也有其他已經(jīng)可以用于生產(chǎn)環(huán)境的純Python服務(wù)器。

配置mod_wsgi并運(yùn)行Apache,在一個(gè)獨(dú)立的WSFIDaemonProcess中運(yùn)行Python代碼,由mod_wsgi啟動(dòng)守護(hù)進(jìn)程。

在后端運(yùn)行一個(gè)類似于Gunicorn的Python HTTP服務(wù)器(或者支持所選異步框架的任何服務(wù)器),然后在前端運(yùn)行一個(gè)既能返回靜態(tài)文件,又能對Python編寫的動(dòng)態(tài)資源服務(wù)進(jìn)行反向代理的Web服務(wù)器。

在最前端運(yùn)行一個(gè)純粹的反向代理(如Varnish),在該反向代理后端運(yùn)行Apache或者nginx,在后端運(yùn)行Python編寫的HTTP服務(wù)器。這是一個(gè)三層的架構(gòu)。這些反向代理可以分布在不同的地理位置,這樣子就能夠?qū)㈦x客戶端最近的反向代理上的緩存資源返回給發(fā)送請求的客戶端。

使用Python搭建http服務(wù)器
長期以來,對這4個(gè)架構(gòu)的選擇主要基于CPython的3個(gè)運(yùn)行時(shí)的特性,即解釋器占用內(nèi)存大、解釋器運(yùn)行慢、全局解釋器(GIL,Global Interpreter Lock)禁止多個(gè)線程同時(shí)運(yùn)行Python字節(jié)碼。但同時(shí)帶來了內(nèi)存中只能載入一定數(shù)量的Python實(shí)例。

4、平臺(tái)即服務(wù)

這個(gè)概念的出現(xiàn)是因?yàn)楝F(xiàn)在的自動(dòng)化部署、持續(xù)集成以及高性能大規(guī)模服務(wù)的相關(guān)技術(shù)的出現(xiàn)和處理有一些繁雜。所以有一些提供商提出了PaaS(Platform as a Service),現(xiàn)在只需關(guān)心應(yīng)該如何打包自己的應(yīng)用程序,以便將自己的應(yīng)用部署到這些服務(wù)之上。
PaaS提供商會(huì)解決構(gòu)建和運(yùn)行HTTP服務(wù)中的出現(xiàn)的各種煩心事。不需要再關(guān)心服務(wù)器,或者是提供IP地址之類的事情。
PaaS會(huì)根據(jù)客戶規(guī)模提供負(fù)載均衡器。只需要給PaaS提供商提供配置文件即可完成各種復(fù)雜的步驟。
現(xiàn)階段比較常用的有Heroku和Docker。
大多數(shù)PaaS提供商不支持靜態(tài)內(nèi)容,除非我們在Python應(yīng)用程序中實(shí)現(xiàn)了對靜態(tài)內(nèi)容的更多支持或者向容器中加入了Apache或ngnix。盡管我們可以將靜態(tài)資源和動(dòng)態(tài)頁面的路徑放在兩個(gè)完全不同的URL空間內(nèi),但是許多架構(gòu)師還是傾向于將兩者放在同一個(gè)名字空間內(nèi)。

5、不使用Web框架編寫WSGI可調(diào)用對象

下面第一段代碼是用于返回當(dāng)前時(shí)間的原始WSGI可調(diào)用對象。

#!/usr/bin/env?python3?
#?A?simple?HTTP?service?built?directly?against?the?low-level?WSGI?spec.?
?
import?time?
?
def?app(environ,?start_response):?
????host?=?environ.get('HTTP_HOST',?'127.0.0.1')?
????path?=?environ.get('PATH_INFO',?'/')?
????if?':'?in?host:?
????????host,?port?=?host.split(':',?1)?
????if?'?'?in?path:?
????????path,?query?=?path.split('?',?1)?
????headers?=?[('Content-Type',?'text/plain;?charset=utf-8')]?
????if?environ['REQUEST_METHOD']?!=?'GET':?
????????start_response('01?Not?Implemented',?headers)?
????????yield?b'01?Not?Implemented'?
????elif?host?!=?'127.0.0.1'?or?path?!=?'/':?
????????start_response('404?Not?Found',?headers)?
????????yield?b'404?Not?Found'?
????else:?
????????start_response('200?OK',?headers)?
????????yield?time.ctime().encode('ascii')

第一段比較冗長。下面使用第三方庫簡化原始WGSI的模式方法。
第一個(gè)示例是使用WebOb編寫的可調(diào)用對象返回當(dāng)前時(shí)間。

#!/usr/bin/env?python3?
#?A?WSGI?callable?built?using?webob.?
?
import?time,?webob?
?
def?app(environ,?start_response):?
????request?=?webob.Request(environ)?
????if?environ['REQUEST_METHOD']?!=?'GET':?
????????response?=?webob.Response('501?Not?Implemented',?status=501)?
????elif?request.domain?!=?'127.0.0.1'?or?request.path?!=?'/':?
????????response?=?webob.Response('404?Not?Found',?status=404)?
????else:?
????????response?=?webob.Response(time.ctime())?
????return?response(environ,?start_response)

第二個(gè)是使用Werkzeug編寫的WSGI可調(diào)用對象返回當(dāng)前時(shí)間。

#!/usr/bin/env?python3?
#?A?WSGI?callable?built?using?Werkzeug.?
?
import?time?
from?werkzeug.wrappers?import?Request,?Response?
?
@Request.application?
def?app(request):?
????host?=?request.host?
????if?':'?in?host:?
????????host,?port?=?host.split(':',?1)?
????if?request.method?!=?'GET':?
????????return?Response('501?Not?Implemented',?status=501)?
????elif?host?!=?'127.0.0.1'?or?request.path?!=?'/':?
????????return?Response('404?Not?Found',?status=404)?
????else:?
????????return?Response(time.ctime())

大家可以對比這兩個(gè)庫在簡化操作時(shí)的不同之處,Werkzeug是Flask框架的基礎(chǔ)。

當(dāng)前題目:使用Python搭建http服務(wù)器
URL標(biāo)題:http://www.rwnh.cn/article40/jscceo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化網(wǎng)站設(shè)計(jì)、面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)網(wǎng)站收錄、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
克山县| 怀柔区| 民乐县| 漳州市| 满洲里市| 青铜峡市| 蒲江县| 双桥区| 北流市| 如皋市| 汉寿县| 瓦房店市| 西峡县| 阳谷县| 石景山区| 鄂托克前旗| 灵璧县| 乌海市| 德令哈市| 孝感市| 紫金县| 仙游县| 嘉荫县| 黑河市| 大厂| 嘉定区| 花莲市| 永善县| 维西| 西华县| 岱山县| 宝应县| 卢氏县| 东莞市| 孝义市| 湘潭市| 南平市| 永和县| 环江| 河南省| 弋阳县|