2014-09-01 3 views
5

Я ищу модуль, который предоставляет мне основные возможности HTTP-сервера для локального доступа. Похоже, у Python есть два метода для реализации простых HTTP-серверов в стандартной библиотеке: wsgiref.simple_server и BaseHttpServer.Различия между BaseHttpServer и wsgiref.simple_server

В чем разница? Есть ли веская причина предпочитать одну над другой?

ответ

7

Короткий ответ:wsgiref.simple_server - адаптер WSGI за BaseHTTPServer.

Более длинный ответ:

BaseHTTPServerSocketServer, на котором он строит) является модуль, который реализует большую часть фактического сервера 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, в будущем.

Смежные вопросы