Что делает бутылка в своей реализации сервера wsgiref, что встроенный в Python WSGIref простой сервер нет? Когда я смотрю на бутылки, например, в соответствии со стандартом WSGI и документации говорится:Как встроенный сервер WSGI от Bottle отличается от стандартного серверного модуля Python wsgiref?
1.5.1 Параметры сервера Встроенный сервер по умолчанию основывается на wsgiref WSGIServer. Этот непотоковый HTTP-сервер отлично подходит для разработки и раннего производства, но может стать результатом узким местом при увеличении нагрузки на сервер.
Есть три способа, чтобы устранить это узкое место:
- • Используйте другой сервер, либо многопоточный или асинхронный.
- • Запустите несколько серверных процессов и распределите нагрузку с помощью балансировщика нагрузки.
- • У обоих [курсив мой]
Тем не менее, все, что я прочитал говорит, чтобы не использовать Python wsgrief сервер для ничего производства.
Что делает бутылка с wsgrief, что встроенный в Python wsgiref нет? Я не стану сомневаться в мудрости использования асинхронных серверов или «больших» более «масштабируемых» WSGI-серверов. Но я хотел бы знать, что делает «Бутылка» с сервером wsgiref, что делает это хорошо для «раннего производства», в обычной библиотеке этого нет.
Мое приложение будет обслуживать менее 20 человек, попавших в базу данных PostgreSQL или MySQL, операции CRUD. Я думаю, вы могли бы задать аналогичный вопрос с Flask.
Для справки,
http://bottlepy.org/docs/dev/bottle-docs.pdf [PDF] https://docs.python.org/2/library/wsgiref.html#module-wsgiref.simple_server 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
Не уверен, что я полностью понимаю вашу точку зрения. Вы повесили трубку на словах «раннее производство»? (Они ничего не значат.) –
@ ron.rothman Да, потому что он говорит «рано», как будто вы действительно можете использовать встроенный для некоторого уровня производительности. – johnny
Ну, по крайней мере, [одна запись в Python tracker] (https://bugs.python.org/issue26005) отмечает, что встроенный Python не выполняет много необходимых проверок безопасности (например, в этом случае , для предотвращения простых DoS-атак). Не знаю, адресован ли Бутыль. Я подозреваю, что это не так, и их утверждение о том, что это ранний выпуск, недействительно. – ShadowRanger