Чем встроенный WSGI-сервер Bottle отличается от стандартного серверного модуля Python wsgiref?
Что делает Bottle в своей реализации сервера wsgiref, а встроенный простой Python WSGIref - нет? Например, когда я смотрю на Bottle, он соответствует стандарту WSGI и в документации говорится:
1.5.1 Параметры сервера Встроенный сервер по умолчанию основан на wsgiref WSGIServer. Этот не многопоточный HTTP-сервер идеально подходит для разработки и раннего производства, но может стать узким местом для производительности при увеличении нагрузки на сервер.
Существует три способа устранения этого узкого места:
- • Используйте другой сервер, который является многопоточным или асинхронным.
- • Запустите несколько процессов сервера и распределите нагрузку с помощью балансировщика нагрузки.
- • Делайте оба [выделите мое]
Тем не менее, все, что я прочитал, говорит, что не следует использовать сервер Python wsgrief для производства чего-либо.
Что делает Bottle с wsgrief, чего не делает встроенный в Python wsgiref? Я не подвергаю сомнению целесообразность использования асинхронных серверов или "более крупных" более "масштабируемых" серверов WSGI. Но я хотел бы знать, что делает Bottle с сервером wsgiref, что делает его нормальным для "раннего производства", а обычная библиотека - нет.
Мое приложение будет обслуживать менее 20 человек, использующих базы данных PostgreSQL или MySQL, операции CRUD. Я думаю, вы могли бы задать аналогичный вопрос с Flask.
Для справки,
http://bottlepy.org/docs/dev/bottle-docs.pdf [pdf] https://docs.python.org/2/library/wsgiref.html https://github.com/bottlepy/bottle/blob/master/bottle.py
Это реализация бутылки, по крайней мере, для открытия порта:
class WSGIRefServer(ServerAdapter):
def run(self, app): # pragma: no cover
from wsgiref.simple_server import make_server
from wsgiref.simple_server import WSGIRequestHandler, WSGIServer
import socket
class FixedHandler(WSGIRequestHandler):
def address_string(self): # Prevent reverse DNS lookups please.
return self.client_address[0]
def log_request(*args, **kw):
if not self.quiet:
return WSGIRequestHandler.log_request(*args, **kw)
handler_cls = self.options.get('handler_class', FixedHandler)
server_cls = self.options.get('server_class', WSGIServer)
if ':' in self.host: # Fix wsgiref for IPv6 addresses.
if getattr(server_cls, 'address_family') == socket.AF_INET:
class server_cls(server_cls):
address_family = socket.AF_INET6
self.srv = make_server(self.host, self.port, app, server_cls,
handler_cls)
self.port = self.srv.server_port # update port actual port (0 means random)
try:
self.srv.serve_forever()
except KeyboardInterrupt:
self.srv.server_close() # Prevent ResourceWarning: unclosed socket
raise
1 ответ
РЕДАКТИРОВАТЬ:
Что делает Bottle в своей реализации сервера wsgiref, а встроенный простой Python WSGIref - нет?
Что делает Bottle с wsgrief, чего не делает встроенный в Python wsgiref?
Ничего (по существу).
Не уверен, что понимаю ваш вопрос, но я постараюсь помочь.
Причина моего замешательства заключается в следующем: фрагмент кода, который вы разместили, точно отвечает [на мой взгляд] вашему вопросу. бутылки WSGIRefServer
класс не делает ничего существенного кроме обтекания wsgiref.simple_server
, (Я называю протоколирование и настройки IPv6 несущественными, потому что они не связаны с "готовностью к производству", которая, как я понимаю, лежит в основе вашего вопроса.
Возможно ли, что вы неправильно истолковали документы? Я думаю, возможно, да, потому что вы говорите:
Я хотел бы знать, что делает Bottle с сервером wsgiref, что делает его нормальным для "раннего производства", а обычная библиотека - нет.
но документы по Бутылке делают то, что Бутылка WSGIRefServer
не следует использовать для обработки высокопроизводительных нагрузок.
Другими словами, WSGIRefServer
такой же как wsgiref
в то время как я думаю, что вы истолковали документы как говорящие, что первое как-то улучшилось по сравнению со вторым. (Это не.)
Надеюсь это поможет!