【问题标题】:which is a minimalistic python wsgi development server with support for code reload? [closed]哪个是支持代码重新加载的简约 python wsgi 开发服务器? [关闭]
【发布时间】:2010-01-29 12:13:36
【问题描述】:

据我所知

  1. wsgiref - 无需重新加载代码
  2. CherryPy - 不仅仅是服务器
  3. mod_wsgi - 所有 apache 开销
  4. paste.httpserver - paste 是一个巨大的包,里面有其他东西
  5. flup - 和 paste 一样,东西太多了。
  6. Spawning - 从未使用过,但看起来足够轻巧。
  7. Tornado - 不是真正的 wsgi + 完整的“框架”
  8. Werkzeug - 运行命令

还有其他人吗?你更喜欢哪一个?

【问题讨论】:

  • Apache 没有很多人声称的开销。如果您对其进行配置并正确使用它(大多数人没有这样做),那么它并没有人们想象的那么糟糕。不幸的是,不知情的人一直在传播这个关于 Apache 臃肿的神话。 :-(
  • 格雷厄姆,请不要误会我的意思。我真的很喜欢 apache,而且(我认为)我很擅长配置它。我完全同意大多数 apache-haters 是不知道如何工作的人。但是我的意图完全不同,我想为团队中的其他开发人员提供一个简单的 requirements.txt 文件,让他们运行,然后部署在 mod_wsgi 中,这样人们就不必学习和配置自己的开发 apache 实例。
  • 我正在寻找与 OP 相同的解决方案。 FWIW:我对 Apache 的问题是它不能很好地与几个导入的模块一起使用——比如 Shapely。我想在单独调试 Apache 问题时继续开发我的 wsgi 应用程序(重新加载)。

标签: python wsgi


【解决方案1】:

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

许多 WSGI 环境都有重新加载基本脚本的方法,例如 mod_wsgi 的 WSGIScriptReloading,默认情况下是打开的。不幸的是,您可能会将大部分代码放在模块中,而重新加载并不容易。在 mod_wsgi 中,您还可以通过在守护程序模式下发送 SIGINT 来执行重新加载来实现。不幸的是,您仍然必须嗅探您用于 mtime 更新的每个模块,以便知道您是否必须重新加载。而且它在嵌入模式下不起作用。

一种复杂但可行的方法是嗅探应用程序中的所有模块,如果自上次检查后有任何更新,则重新加载它们。您必须立即重新加载它们,方法是将它们全部从 sys.modules 查找中删除(当您在那里时也删除 None-valued 条目,以避免相关导入查找问题),以确保它们不会保留交叉引用自己的旧版本。当然,他们不得在您的应用程序之外留下对自己的其他引用。您可以在 ModuleUpdaterhere 中看到一个这样的例子。

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

【讨论】:

  • 您似乎正在重新发明上述所有模块的功能,例如 Spawning 实现了您的代码重载算法。也就是说,我不打算开始另一个实施。
  • 不完全是重新发明;我使用它的时间比 Spawning 存在的时间还要长!我所知道的与其他人的不同之处在于,WSGI 部署几乎就是这个模块所做的一切;它不会将服务器或应用程序框架拖入等式中。
  • 我不想打架,但是 paste.reloader 比 Spawning 还要老。我最初的观点是你指向你的代码没有在 pypi 中正式发布,你说它是稳定的,但你并不支持它(或者看起来如此)
  • 我将其作为示例代码,用于在没有框架包的情况下重新加载代码的工作方法,而不是建议人们现在部署它。
【解决方案2】:

你可能想看看Werkzeug - 它是一个 WSGI 实用工具包。它包括一个 runserver 函数,该函数采用 wsgiref 服务器并添加自动代码重新加载(您也可以将其配置为在配置文件更改时重新加载)和一个很棒的调试器。

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

【讨论】:

  • 我对框架一无所知。事实上,我是 TurboGears 的重要贡献者,他说您需要使用正确的工具来完成这项工作,在这种情况下,安装 paste 似乎是一个仅用于测试的巨大软件包。
  • 好吧,我想我只是误解了你的措辞。对此感到抱歉。
  • 聚会迟到了,但是使用 cgi.FieldStorage 有什么问题?推荐使用cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ) 之类的教程,它可以工作。
【解决方案3】:

从 werkzeug 查看 run_simple:

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

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

【讨论】:

    【解决方案4】:

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

    使用 Django 似乎我需要订阅 Django 的做事方式。尽管 Django 提供了更多开箱即用的功能(默认管理界面、网页上的小部件),但使用 CherryPy 似乎只是另一个具有非常好的(通常会让您惊讶)功能的导入。

    【讨论】:

    • 如果你喜欢cherrypy,那么你会喜欢WebError。也就是说,您似乎正在将“网络框架”与“网络服务器”混合在一起。
    【解决方案5】:

    我推荐 paste 或 CherryPy。它们是最容易启动和运行的。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        # 运行粘贴重新加载器 导入 paste.reloader 作为重新加载器 reloader.install() # 运行 wsgiref 服务器 从 wsgiref 导入 simple_server simple_server.make_server('', 8080, main_wsgi_app).serve_forever()

        够简约吗?

        【讨论】:

        • 看起来很有希望。但是 paste.reloader 文档 (pythonpaste.org/modules/reloader.html) 似乎说你必须将它包装在一个循环的 shell 脚本中。换句话说,“重新加载器”似乎只是在代码更改时退出 server_forever() 调用;调用者仍然需要通过循环调用重新加载。是吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 2012-07-13
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多