【问题标题】:Python web programmingPython网络编程
【发布时间】:2010-10-09 12:35:02
【问题描述】:

早上好。

正如标题所示,我有一些关于使用 python 进行 Web 开发的问题。

  • 什么是开发环境的最佳设置,更具体地说,使用什么网络服务器,如何将 python 与它绑定。最好,我希望它可以在 *nix 和 win 环境中实现。

当我上次尝试 apache + mod_python + CherryPy 时,我主要担心的是必须重新加载网络服务器才能看到更改。算不算正常?由于某种原因,cherrypy 的自动重载根本不起作用。

  • 将正常工作的 Python 应用程序部署到生产环境的最佳设置是什么?为什么?我现在在我的 PHP Web 应用程序中使用 lighttpd,但是与 nginx 相比,它对 python 的影响如何?

  • 是否值得直接使用框架或自行推出一些简单的东西?我看到 Django 有很多粉丝,但我认为这对我的需求来说太过分了,所以我开始研究 CherryPy。

  • 如果我必须重新加载 httpd 才能看到更改,那么 Python 应用程序究竟如何提供服务?类似于生成子进程的永久进程,所有主要文件都包括在服务器启动时发生,然后只是延迟加载所需的资源?

  • Python 支持多线程,在开发 Web 应用程序时是否需要考虑使用它以获得好处?在什么情况下会有什么好处?

非常感谢!

【问题讨论】:

    标签: python cherrypy


    【解决方案1】:

    看看谷歌应用引擎。从他们的网站:

    Google App Engine 可让您运行您的 Google 上的网络应用程序 基础设施。应用引擎 应用程序易于构建,容易 维护,并且易于扩展为您的 流量和数据存储需求增长。 使用 App Engine,没有服务器 维护:您只需上传您的 应用程序,它已准备好服务 您的用户。

    您可以使用免费的 appspot.com 域上的域名, 或使用 Google Apps 从 您自己的域。你可以分享你的 与世界的应用,或限制 访问您的成员 组织。

    App Engine 无需任何费用即可获得 开始了。注册一个免费帐户, 你可以开发和发布你的 应用程序让世界看到,在 不收费,也没有义务。一种 免费帐户最多可使用 500MB 持久存储和足够的 CPU 和 大约500万页的带宽 一个月的浏览量。

    最好的部分:它包括 Python 支持,包括 Django。转至http://code.google.com/appengine/docs/whatisgoogleappengine.html

    【讨论】:

    • 谢谢,但我不想让我的应用程序锁定在某个供应商平台上,并且在不重写的情况下使它们完全不可移植。
    • 你问过最好的设置是什么……谷歌的基础设施是最好的。他们的免费计划有足够的带宽和 CPU,每月可浏览 500 万次页面......
    【解决方案2】:

    当您在线程化的 Apache 服务器(Windows 上的默认设置)上使用 mod_python 时,CherryPy 会在与 Apache 相同的进程中运行。在这种情况下,您几乎可以肯定希望 CP 重新启动该过程。

    解决方案:使用mod_rewritemod_proxy 让CherryPy 在自己的进程中运行。然后你可以自动重新加载到你心中的内容。 :)

    【讨论】:

      【解决方案3】:

      什么是开发环境的最佳设置?

      没关系。我们使用 Django,它可以很好地在 Windows 和 Unix 中运行。对于生产,我们在 Red Hat 中使用 Apache。

      是否必须重新加载网络服务器才能看到正常的更改?

      是的。不清楚为什么你想要不同的东西。 Web 应用软件不应该是动态的。内容是的。软件编号。

      在 Django 中,我们在桌面上开发而不使用任何类型的 Web 服务器。在大多数情况下,Django“runserver”命令会重新加载应用程序。对于开发,这很有效。它不会重新加载的时候是我们严重损坏了东西以至于应用程序无法正常运行的时候。

      将正常工作的 Python 应用部署到生产环境的最佳设置是什么?为什么?

      “最佳”在此上下文中未定义。因此,请为“巢”提供一些限定条件(例如,“最快”、“最便宜”、“最蓝”)

      值得直接使用框架还是自己推出一些简单的东西?

      不要浪费时间自己动手。我们使用 Django 是因为我们不需要编写或维护内置的管理页面。节省大量工作。

      如果我必须重新加载 httpd 才能看到更改,那么 Python 应用程序究竟如何提供服务?

      两种方法:

      • 守护进程 - mod_wsgi 或 mod_fastcgi 有一个它们连接到的 Python 守护进程。改变你的软件。重启守护进程。

      • 嵌入式 - mod_wsgi 或 mod_python 具有嵌入式模式,其中 Python 解释器位于 mod 内部,位于 Apache 内部。您必须重新启动 httpd 才能重新启动该嵌入式解释器。

      我是否需要考虑使用多线程?

      是和不是。是的,您确实需要意识到这一点。不,你不需要做太多事情。 Apache 和 mod_wsgi 和 Django 应该为你处理这个问题。

      【讨论】:

      • 非常清晰和有帮助。关于必须重新加载服务器.. 我想我多年来对 PHP 形成了一种错误的心态,你知道的,有点类型 - 检查浏览器,重复。如果不经常检查浏览器中的结果,不确定开发会有多容易,有什么提示吗?
      • 在 Django 中,我们不使用 Web 服务器进行开发。 Django "runserver" 命令创建一个可用的 Web 服务器并为我们重新加载应用程序。非常适合开发。
      • 确实,我认为对于开发模式来说,自动重新加载非常有用。对于现场舞台当然不再。但是例如您可以同时使用“paster server my.ini”或“paster server my.ini --reload”。
      • +1:非常清晰(像往常一样)。我仍然喜欢实时站点的自动加载,因为我正在运行 6 个 django 站点、1 个 ruby​​、2 个 php,我讨厌所有这些站点都重新启动。
      • @Van Gale:自动加载可能会很好。不过,我对此并没有太大的信心。你的经历可能比我的更积极。
      【解决方案4】:

      +1 对 MrTopf 的回答,但我会添加一些额外的意见。

      网络服务器

      Apache 是可以为您提供最大可配置性的网络服务器。避免使用 mod_python,因为它基本上不受支持。另一方面,mod_wsgi 得到了很好的支持,并为您提供了更好的稳定性(换句话说,与尖峰和不可预测相比,更容易配置 cpu/内存使用以保持稳定)。

      另一个巨大的好处,你可以配置 mod_wsgi 来重新加载你的应用程序,如果 wsgi 应用程序脚本被触及,不需要重新启动 Apache。对于开发/测试服务器,您甚至可以配置 mod_wsgi 以在应用程序中的任何文件更改时重新加载。这非常有用,我什至在开发期间在我的笔记本电脑上运行 Apache+mod_wsgi。

      Nginx 和 lighttpd 通常用于网络服务器,或者通过 fastCGI 接口直接为 Python 应用程序提供服务(暂时不要在这些服务器上使用任何 WSGI 接口),或者将它们用作 Apache 的前端。对应用程序的调用通过(通过代理)传递到 Apache+mod_wsgi,然后 nginx/lighttpd 直接提供静态内容。

      Nginx 具有额外的优势,如果您想要更复杂,可以直接从 memcached 提供内容。我听说过 cmets 对 lighttpd 的贬低,它似乎确实存在一些开发问题,但肯定有一些大公司成功地使用它。

      Python 堆栈

      在最低级别,您可以直接对 WSGI 进行编程以获得最佳性能。有很多有用的 WSGI 模块可以在您不想自己开发的领域为您提供帮助。在这个级别,您可能希望选择第三方 WSGI 组件来执行 URL 解析和 HTTP 请求/响应处理等操作。一个很好的请求/响应组件是WebOb

      如果您查看Pylons,您会看到他们关于“同类最佳” WSGI 组件的想法以及一个比 Django 更容易选择您自己的组件(如模板引擎)的框架。

      Django 可能有点矫枉过正,但我​​不认为这是一个很好的反对理由。 Django 让简单的事情变得更容易。当您开始进入非常复杂的应用程序时,您确实需要考虑迁移到较低级别的框架。

      【讨论】:

        【解决方案5】:

        以下是我的想法:

        我正在使用Python Paste 开发我的应用程序并最终运行它(或任何其他python Web 服务器)。我通常不使用 mod_python 或 mod_wsgi,因为它使开发设置更加复杂。

        我使用zc.buildoutvirtualenv 一起管理我的开发环境和所有依赖项。这给了我一个独立的沙箱,它不会干扰系统范围内安装的任何 Python 模块。

        对于部署,我也使用 buildout/virtualenv,最终使用不同的 buildout.cfg。我也在使用Paste Deploy,它是一种配置机制,我有不同的配置文件用于开发和部署。

        由于我通常单独运行 paste/cherrypy 等,我正在使用 Apache、NGINX 或者可能只是在它前面单独使用 Varnish。这取决于您需要哪些配置选项。例如。如果不需要虚拟主机、重写规则等,那么我不需要前面的全功能 Web 服务器。使用 Web 服务器时,我通常使用 ProxyPass 或使用 mod_rewrite 进行一些更复杂的重写。

        我目前使用的 Python Web 框架是 repoze.bfg,顺便说一句。

        至于您关于重新加载的问题,我知道在运行它时会遇到这些问题,例如mod_python 但是当使用独立的“paster serve ... -reload”等时,它到目前为止工作得非常好。 repoze.bfg 还具有一些设置,用于在模板更改时自动重新加载模板。如果您使用的框架具有,则应记录在案。

        至于通常在 python web 服务器中使用的多线程。由于 CherryPy 支持这一点,我想你不必担心,它应该自动使用。您最终应该进行一些基准测试,以了解您的应用程序在多少线程下执行得最好。

        希望对您有所帮助。

        【讨论】:

        • 很高兴我能提供帮助,但当然我还在学习/尝试最好的方法。我应该补充一点,repoze.bfg 也是基于 WSGI 构建的。还有很多有用的中间件,比如 Paste#evalerror、repoze.errorlog、repoze.profiler 等。
        猜你喜欢
        • 2012-04-27
        • 1970-01-01
        • 2023-03-27
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2011-08-12
        相关资源
        最近更新 更多