我正在尋找一個模塊,它爲我提供了本地訪問的基本http服務器功能。看起來Python有兩種方法可以在標準庫中實現簡單的http服務器:wsgiref.simple_server和BaseHttpServer。BaseHttpServer和wsgiref.simple_server之間的差異
有什麼區別?是否有強烈的理由相對於另一方偏好?
我正在尋找一個模塊,它爲我提供了本地訪問的基本http服務器功能。看起來Python有兩種方法可以在標準庫中實現簡單的http服務器:wsgiref.simple_server和BaseHttpServer。BaseHttpServer和wsgiref.simple_server之間的差異
有什麼區別?是否有強烈的理由相對於另一方偏好?
簡短回答:wsgiref.simple_server
是一個超過BaseHTTPServer
的WSGI適配器。
較長的答案:
BaseHTTPServer
(和SocketServer
,在其上構建)是實現最實際的HTTP服務器的模塊。它可以接受請求並返回響應,但它必須知道如何處理這些請求。當你使用直接BaseHTTPServer
,則通過子類BaseHTTPRequestHandler
,例如提供處理程序:
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type', 'text/plain')
self.end_headers()
self.wfile.write('Hello world!\n')
HTTPServer(('', 8000), MyHandler).serve_forever()
wsgiref.simple_server
適應此BaseHTTPServer
接口向WSGI規範,這是獨立於服務器的Python網絡應用程序的標準。在WSGI,你提供的函數的形式的處理程序,例如:
from wsgiref.simple_server import make_server
def my_app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
yield 'Hello world!\n'
make_server('', 8000, my_app).serve_forever()
的make_server
函數返回的WSGIServer
一個實例,它繼承大多數從BaseHTTPServer.HTTPServer
和SocketServer.TCPServer
的實際協議/網絡邏輯的(儘管它最終會重新實現一些簡單的HTTP規則)。主要不同之處在於您將應用程序代碼與該邏輯集成的方式。
這真的取決於你試圖解決的問題,但對編碼是wsgiref
可能是一個更好的主意,因爲它會很容易讓你移動到不同的生產級的HTTP服務器,如uWSGI或Gunicorn,未來。