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

Надеюсь это поможет!

Другие вопросы по тегам