Bottle的内置WSGI服务器与标准的Python wsgiref服务器模块有何不同?

时间:2016-01-26 16:22:54

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

什么是瓶子在其wsgiref服务器实现中做的内置Python WSGIref简单服务器不是?例如,当我查看Bottle时,它遵循WSGI标准并且文档声明:

  
    

1.5.1服务器选项内置的默认服务器基于wsgiref WSGIServer。这个非线程的HTTP服务器非常适合     开发和早期生产,但可能会成为一种表现     服务器负载增加时的瓶颈     有三种方法可以消除这个瓶颈:

  
     
      
  • •使用多线程或异步的其他服务器。
  •   
  • •启动多个服务器进程并使用负载均衡器分散负载。
  •   
  • •两者都做   [强调我的]
  •   

然而,我读过的所有内容都表示不要将Python wsgrief服务器用于任何生产。

使用内置Python wsgiref不具备的wsgrief做什么?我并没有真正质疑使用异步服务器的智慧,或者更大的"更大的"更多"可扩展" 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

1 个答案:

答案 0 :(得分:1)

编辑:

  

什么是瓶子在其wsgiref服务器实现中做的内置Python WSGIref简单服务器不是?

     

使用内置Python wsgiref不具备的wsgrief做什么?

没有(实质内容)。

我不确定我理解你的问题,但我会尝试帮助。

我混淆的原因是:您发布的代码段正好回答了[我认为]您的问题。除了WSGIRefServer之外,Bottle wsgiref.simple_server类没有任何实质内容。 (我称之为日志记录和IPv6调整不实际,因为它们与"生产准备无关,"我收集的是你问题的核心。

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

  

我想知道Bottle正在使用wsgiref服务器做什么,这使得#34;早期生产,"普通图书馆没有。

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

换句话说,WSGIRefServerwsgiref相同/相同,而我认为你解释说文档说前者在某种程度上比后者有所改进。 (事实并非如此。)

希望这有帮助!