日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

為了提高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)行交互了。現(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ù)。

1、WSGI

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

# 用WSGI應(yīng)用形式編寫的簡(jiǎn)單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è)簡(jiǎn)單的情況。但是在編寫服務(wù)器程序時(shí),復(fù)雜度就大大提升了。這是因?yàn)橐耆紤]標(biāo)準(zhǔn)中的描述的許多注意點(diǎn)和邊界情況。

2、前向代理與反向代理

無論前向代理還是反向代理,HTTP代理其實(shí)就是一個(gè)HTTP服務(wù)器,用于接收請(qǐng)求,然后對(duì)接收到的請(qǐng)求(至少是部分請(qǐng)求)進(jìn)行轉(zhuǎn)發(fā)。轉(zhuǎn)發(fā)請(qǐng)求時(shí)代理會(huì)扮演客戶端的角色,將轉(zhuǎn)發(fā)的HTTP請(qǐng)求發(fā)送至真正的服務(wù)器,最后將從服務(wù)器接受到的響應(yīng)發(fā)揮扮演客戶端的角色,將轉(zhuǎn)發(fā)的請(qǐng)求發(fā)送至真正的服務(wù)器,最后將從服務(wù)器接受到的響應(yīng)發(fā)回給最初的客戶端。

下面是前向代理和反向代理的簡(jiǎn)圖。

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

 

 

反向代理已經(jīng)廣泛應(yīng)用于大型的HTTP服務(wù)當(dāng)中。反向代理是Web服務(wù)的一部分,對(duì)于HTTP客戶端并不可見。

3、四種架構(gòu)

架構(gòu)師一般都使用很多種復(fù)雜的機(jī)制來將多個(gè)子模塊組合建成一個(gè)HTTP服務(wù)。現(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接口。現(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)文件,又能對(duì)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ā)送請(qǐng)求的客戶端。

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

 

 

長(zhǎng)期以來,對(duì)這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)容,除非我們?cè)赑ython應(yīng)用程序中實(shí)現(xiàn)了對(duì)靜態(tài)內(nèi)容的更多支持或者向容器中加入了Apache或ngnix。盡管我們可以將靜態(tài)資源和動(dòng)態(tài)頁(yè)面的路徑放在兩個(gè)完全不同的URL空間內(nèi),但是許多架構(gòu)師還是傾向于將兩者放在同一個(gè)名字空間內(nèi)。

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

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

#!/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('501 Not Implemented', headers) 
 yield b'501 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') 

第一段比較冗長(zhǎng)。下面使用第三方庫(kù)簡(jiǎn)化原始WGSI的模式方法。

第一個(gè)示例是使用WebOb編寫的可調(diào)用對(duì)象返回當(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)用對(duì)象返回當(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()) 

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

分享到:
標(biāo)簽:服務(wù)器 http
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定