日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python搭建http服務(wù)器具體方法

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

公司主營業(yè)務(wù):成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出梁溪免費做網(wǎng)站回饋大家。

為了提高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)就是添加了一層中間層。通過這一個中間層,用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)用的,并且有兩個輸入?yún)?shù)。

1、WSGI

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

上述只是一個簡單的情況。但是在編寫服務(wù)器程序時,復(fù)雜度就大大提升了。這是因為要完全考慮標(biāo)準(zhǔn)中的描述的許多注意點和邊界情況。

2、前向代理與反向代理

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

3、四種架構(gòu)

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

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

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

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

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

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

4、平臺即服務(wù)

這個概念的出現(xiàn)是因為現(xiàn)在的自動化部署、持續(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提供商會解決構(gòu)建和運行HTTP服務(wù)中的出現(xiàn)的各種煩心事。不需要再關(guān)心服務(wù)器,或者是提供IP地址之類的事情。 PaaS會根據(jù)客戶規(guī)模提供負(fù)載均衡器。只需要給PaaS提供商提供配置文件即可完成各種復(fù)雜的步驟。 現(xiàn)階段比較常用的有Heroku和Docker。 大多數(shù)PaaS提供商不支持靜態(tài)內(nèi)容,除非我們在Python應(yīng)用程序中實現(xiàn)了對靜態(tài)內(nèi)容的更多支持或者向容器中加入了Apache或ngnix。盡管我們可以將靜態(tài)資源和動態(tài)頁面的路徑放在兩個完全不同的URL空間內(nèi),但是許多架構(gòu)師還是傾向于將兩者放在同一個名字空間內(nèi)。

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

下面第一段代碼是用于返回當(dāng)前時間的原始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('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')

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

#!/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)

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

#!/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())

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


文章名稱:Python搭建http服務(wù)器具體方法
當(dāng)前鏈接:http://m.5511xx.com/article/dhdpgdc.html