【问题标题】:How is Bottle's built-in WSGI server different from the standard Python wsgiref server module?Bottle 内置的 WSGI 服务器与标准 Python wsgiref 服务器模块有何不同?
【发布时间】:2016-05-03 07:13:35
【问题描述】:

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#module-wsgiref.simple_server https://github.com/bottlepy/bottle/blob/master/bottle.py

这是Bottle的实现,至少是为了打开端口:

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 是的,因为它说“早期”,好像你真的可以使用内置进行某种程度的生产。
  • 好吧,至少one entry on the Python bug tracker 注意到 Python 内置没有执行很多必要的安全检查(例如,在这种情况下,为了防止简单的 DoS 攻击)。不知道瓶子是否解决了这个问题。我怀疑它没有,而且他们声称它是“早期生产”等级的说法是无效的。

标签: python python-3.x wsgi bottle wsgiref


【解决方案1】:

编辑:

Bottle 在其 wsgiref 服务器实现中做了什么而内置 Python WSGIref 简单服务器不是?

Bottle 对 wsgrief 做了什么而 Python 内置的 wsgiref 没有?

没有(实质的)。


不确定我是否理解您的问题,但我会尽力提供帮助。

我感到困惑的原因是:您发布的代码 sn-p 准确地回答了 [我认为是] 您的问题。 Bottle 的 WSGIRefServer 类除了包装 wsgiref.simple_server 之外没有任何实质性的作用。 (我称日志记录和 IPv6 调整无关紧要,因为它们与“生产就绪”无关,我认为这是您问题的核心。)

您是否可能误解了文档?我想也许是的,因为你说:

我想知道 Bottle 对 wsgiref 服务器做了什么,这使得它可以用于“早期生产”,而常规库却没有。

但 Bottle 文档指出,Bottle 的 WSGIRefServer 不应用于处理高吞吐量负载。

换句话说,WSGIRefServerwsgiref相同,而我认为您将文档解释为前者在某种程度上比后者有所改进。 (不是。)

希望这会有所帮助!

【讨论】:

  • 我不确定,因为他们似乎在说您可以将 wsgrief 用于某种程度的生产。也许很小,但在一定程度上。
  • 好的,那么回答你的问题,这样想:WSGIRefServerwsgiref 一样具有生产能力。这有助于澄清文档吗?
  • 文档很清楚。与 Python 社区的其他部分相比,我质疑这些文档的有效性。
  • 好的,我已经编辑了我的答案以直接回答您的实际问题。我希望这样说清楚,因为我不知道如何更清楚地说明它。
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 2019-05-11
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2021-01-02
  • 2012-01-09
相关资源
最近更新 更多