这是一个简约的python wsgi开发服务器,支持代码重载?

时间:2010-01-29 12:13:37

标签: python wsgi

据我所知

  1. wsgiref - 没有代码重新加载
  2. CherryPy - 不仅仅是服务器
  3. mod_wsgi - 所有apache开销
  4. paste.httpserver - paste是一个包含其他内容的大包
  5. flup - 与粘贴相同,太多东西。
  6. 产卵 - 从未使用它,但看起来很轻便。
  7. 龙卷风 - 不是真正的wsgi +完整的“框架”
  8. Werkzeug - runco​​mmand
  9. 那里有其他人吗?你更喜欢哪一个?

7 个答案:

答案 0 :(得分:4)

您可能希望查看的是Werkzeug - 它是一个WSGI实用工具包。它包含一个runserver函数,它接受wsgiref服务器并添加自动代码重新加载(您还可以将其配置为在配置文件更改时重新加载)和一个非常棒的调试器。

另一方面,您对框架的蔑视使得听起来您计划从头开始处理所有WSGI内容,在这种情况下,我建议您使用Werkzeug的实用程序函数来处理解析请求和生成响应。这比自己做的更有趣。 (为了Guido的爱,请不要使用cgi.FieldStorage!)

答案 1 :(得分:4)

从werkzeug查看run_simple:

http://werkzeug.pocoo.org/documentation/0.5.1/serving.html

除了为您提供自动代码重新加载之外,您还可以使用use_debugger = True将其漂亮的调试器包含在您的应用程序之上(其中包括每个回溯行中的控制台)。

答案 2 :(得分:1)

到目前为止,我一直在使用CherryPy,并且与Django(虽然不在你的列表中,是我使用的唯一其他开发服务器)相比,我更喜欢它。它说的是:它只在你需要的时候出现,并在其余的时间里不受影响。

使用Django似乎我需要订阅Django的做事方式。虽然Django提供了更多功能(开源)(默认管理界面,网页上的小部件),但使用CherryPy似乎只是另一个非常好的(通常令人惊讶的是额外的)功能。

答案 3 :(得分:1)

我建议粘贴或CherryPy。他们最容易起床和跑步。

答案 4 :(得分:1)

一种非常简单的方法是CGI(与常规Web服务器一起使用wsgiref.handlers.CGIHandler)。在生产服务器上的性能很糟糕,但对开发很有帮助。您可以编写单个脚本,既可以作为mod_wsgi WSGIScriptAlias(公开application对象),也可以作为mod_cgi ScriptAlias(在wsgiref时调用__name__=='__main__')。

许多WSGI环境都有办法重新加载基本脚本,例如mod_wsgi的WSGIScriptReloading,默认情况下处于启用状态。不幸的是,您可能会将大部分代码放在模块中,这不容易重新加载。在mod_wsgi中,您还可以通过发送SIGINT在守护进程模式下执行重新加载来完成此操作。不幸的是,你仍然需要嗅探你用于mtime更新的每个模块,以便知道你是否需要重新加载。它在嵌入模式下不起作用。

一种混乱但可行的方法是嗅探作为应用程序一部分的所有模块,如果自上次检查后有任何更新,请重新加载它们。您必须立即重新加载它们,方法是从sys.modules查找中删除它们(同时移除None - 值条目,以避免相对导入查找问题),以确保它们不要保持对旧版本的交叉引用。当然,他们不得在您的申请之外留下其他自己的引用。您可以在ModuleUpdater课程here中查看此操作示例。

(这个软件尚未准备好发布,但已经为我的WSGI应用程序提供模块重新加载了几年而且看起来很稳定。想法是将所有WSGI应用程序放在一个包中的应用程序类中,您可以从单个WSGI / CGI /命令行入口点脚本导入;您可以在该脚本中包含部署配置。)

答案 5 :(得分:1)

另外,你错过了web.py,它既小又支持代码重新加载。

答案 6 :(得分:0)

除了其他粘贴模块之外,您可以将paste.reloader与任何wsgi-server一起使用。

# run paste reloader
import paste.reloader as reloader
reloader.install()

# run wsgiref server
from wsgiref import simple_server
simple_server.make_server('', 8080, main_wsgi_app).serve_forever()

那是否足够简约?