ローカル アクセス用の基本的な http サーバー機能を提供するモジュールを探しています。Python には、標準ライブラリに単純な http サーバーを実装するための 2 つの方法があるようです: wsgiref.simple_serverとBaseHttpServer。
違いは何ですか?どちらかを優先する強い理由はありますか?
ローカル アクセス用の基本的な http サーバー機能を提供するモジュールを探しています。Python には、標準ライブラリに単純な http サーバーを実装するための 2 つの方法があるようです: wsgiref.simple_serverとBaseHttpServer。
違いは何ですか?どちらかを優先する強い理由はありますか?
簡単な答え: wsgiref.simple_server
上の WSGI アダプターBaseHTTPServer
です。
より長い答え:
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
インターフェイスを、サーバーに依存しない Python Web アプリケーションの標準であるWSGI仕様に適合させます。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()
この関数は、実際のプロトコル/ネットワーク ロジックのほとんどをandから継承make_server
する のインスタンスを返します(ただし、HTTP のいくつかの単純なルールを再実装することになります)。主な違いは、アプリケーション コードをそのロジックに統合する方法です。WSGIServer
BaseHTTPServer.HTTPServer
SocketServer.TCPServer
それは解決しようとしている問題に大きく依存しますが、将来的にuWSGIやGunicornwsgiref
などの別のプロダクション グレードの HTTP サーバーに簡単に移行できるため、コーディングすることをお勧めします。.