12

早上好。

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

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

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

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

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

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

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

非常感谢!

4

5 回答 5

8

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

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

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

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

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

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

在这种情况下,“最佳”是未定义的。因此,请为“巢”提供一些限定条件(例如,“最快”、“最便宜”、“最蓝”)

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

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

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

两种方法:

  • 守护进程 - mod_wsgi 或 mod_fastcgi 有一个 Python 守护进程与之相连。改变你的软件。重新启动守护程序。

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

我需要考虑使用多线程吗?

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

于 2009-02-24T11:05:43.043 回答
6

所以这是我的想法:

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

我正在使用zc.buildout与virtualenv一起管理我的开发环境和所有依赖项。这给了我一个独立的沙箱,它不会干扰系统范围内安装的任何 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 支持这一点,我想你不必担心,它应该自动使用。您最终应该进行一些基准测试,以了解您的应用程序在多少线程下执行得最好。

希望有帮助。

于 2009-02-24T09:26:54.980 回答
6

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

网络服务器

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

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

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

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

Python 堆栈

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

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

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

于 2009-02-24T09:54:17.473 回答
2

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

Google App Engine 可让您在 Google 的基础架构上运行您的网络应用程序。App Engine 应用程序易于构建、易于维护,并且随着您的流量和数据存储需求的增长而易于扩展。使用 App Engine,无需维护服务器:您只需上传应用程序,即可为用户提供服务。

您可以使用appspot.com 域上的免费域名来提供您的应用程序,或者使用Google Apps 从您自己的域中提供它。您可以与全世界共享您的应用程序,或限制对您组织成员的访问。

App Engine 无需任何费用即可开始使用。注册一个免费帐户,您就可以开发和发布您的应用程序,让全世界都可以看到,而无需任何费用和义务。免费帐户最多可使用 500MB 的持久存储空间以及足够的 CPU 和带宽,每月可浏览约 500 万次页面。

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

于 2009-02-24T17:30:04.697 回答
1

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

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

于 2009-02-24T16:33:18.327 回答