6

ローカル アクセス用の基本的な http サーバー機能を提供するモジュールを探しています。Python には、標準ライブラリに単純な http サーバーを実装するための 2 つの方法があるようです: wsgiref.simple_serverBaseHttpServer

違いは何ですか?どちらかを優先する強い理由はありますか?

4

1 に答える 1

10

簡単な答え: 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 のいくつかの単純なルールを再実装することになります)。主な違いは、アプリケーション コードをそのロジックに統合する方法です。WSGIServerBaseHTTPServer.HTTPServerSocketServer.TCPServer

それは解決しようとしている問題に大きく依存しますが、将来的にuWSGIGunicornwsgirefなどの別のプロダクション グレードの HTTP サーバーに簡単に移行できるため、コーディングすることをお勧めします。.

于 2015-10-20T19:00:56.343 に答える