【发布时间】: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