2016-01-26 6 views
0

Что делает бутылка в своей реализации сервера 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 
+0

Не уверен, что я полностью понимаю вашу точку зрения. Вы повесили трубку на словах «раннее производство»? (Они ничего не значат.) –

+0

@ ron.rothman Да, потому что он говорит «рано», как будто вы действительно можете использовать встроенный для некоторого уровня производительности. – johnny

+1

Ну, по крайней мере, [одна запись в Python tracker] (https://bugs.python.org/issue26005) отмечает, что встроенный Python не выполняет много необходимых проверок безопасности (например, в этом случае , для предотвращения простых DoS-атак). Не знаю, адресован ли Бутыль. Я подозреваю, что это не так, и их утверждение о том, что это ранний выпуск, недействительно. – ShadowRanger

ответ

1

EDIT:

Что Бутылка делает в своей реализации сервера wsgiref, что встроенный в Python WSGIref простой сервер нет?

Что делает бутылка с wsgrief, что встроенный в Python wsgiref нет?

Ничего (от вещества).


Не уверен, что я понимаю ваш вопрос, но я возьмусь за удар.

Причина моего недоразумения: фрагмент кода, который вы опубликовали, точно отвечает на ваш вопрос. Bottle's WSGIRefServer класс не делает ничего существенного, кроме обертывания wsgiref.simple_server.(Я называю журналирование и твиты IPv6 необоснованными, потому что они не связаны с «готовностью к производству», которые я собираю, в основе вашего вопроса.

Возможно ли, что вы неверно истолковали документы? «м мышления, возможно, да, потому что вы говорите:

Я хотел бы знать, что бутылка делает с wsgiref сервера, что делает это хорошо для„раннего производства,“регулярная библиотека не

.

, но документы в бутылках указывают, что Bottle's WSGIRefServer не следует использовать для обработки высоких частот ghput загружается.

Другими словами, WSGIRefServer является/тем же /, что и wsgiref, тогда как, я думаю, вы интерпретировали документы как о том, что первый как-то улучшился над последним. (Это не так).

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

+0

Я не был уверен, потому что, казалось, они говорили, что вы можете использовать wsgrief для некоторого уровня производства. Маленький, может быть, но некоторый уровень. – johnny

+1

Хорошо, тогда, чтобы ответить на ваш вопрос, подумайте об этом так: 'WSGIRefServer' точно так же, как и для производства, как' wsgiref'. Помогает ли это разъяснить документы? –

+0

Документы понятны. Я задаю вопрос о действительности документов по сравнению с остальной частью сообщества Python. – johnny