我需要澄清apache如何与modwsgi和金字塔一起工作

时间:2013-02-01 08:29:59

标签: python apache sqlalchemy mod-wsgi pyramid

我们的服务器配置为使用pyramid+sqlalchemy

运行modwsgi+apache2应用

我们在金字塔应用的__init__.py中有一些内容可以创建数据库并预先填充一些测试用户和帐户。它类似于pyramid cookbook example here

中的initialize_sql函数

out apache config看起来像这样(从某处复制并被黑客攻击):

WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess pyramid user=ubuntu group=staff processes=1 \
   threads=4 \
   python-path= VIRTUAL_ENV_SITE_PACKAGES
WSGIScriptAlias / WSGI_SCRIPT_PATH

<Directory /Users/chrism/modwsgi/env>
  WSGIProcessGroup pyramid
  Order allow,deny
  Allow from all
</Directory>

困扰我们的是,initialize_function被调用许多请求,而不是仅被调用一次。我们不明白apache是​​如何工作的或我们在配置中做了什么。我们希望能够在__init__.py中调用函数一次就可以了。有人可以解释apache实际上是如何工作的,以及为什么金字塔__init__.py一直在重新加载。还解释了我们如何确保__init__.py不会重新运行每个请求

考虑分享关于相同内容的简单易懂的链接:)

2 个答案:

答案 0 :(得分:2)

创建数据库和预先填充它的事情不应该进入WSGI应用程序的__init__.py文件,因为正如您所注意到的,每当您启动服务器时(以及某些其他点),此文件都会运行同样)。

您需要的是一个脚本,可以在需要时从命令行调用。每个框架都提供了自己构建这些框架的方法。在金字塔中,它们被称为console scriptsHere您可以找到自己构建文档的文档。

但是,我建议您使用this tutorial中的scaffold(项目模板),并查看名为initialize_tutorial_db的控制台脚本。它完全符合您的要求,并允许您在需要时从命令行创建/初始化数据库。


关于apache配置,与您的问题相关的行如下:

WSGIDaemonProcess pyramid user=ubuntu group=staff processes=1 \
   threads=4 \
   python-path= VIRTUAL_ENV_SITE_PACKAGES

这意味着您将使用 4 主题开始 1 流程。这并不意味着__init__.py文件中的代码会多次运行。这很可能是由于您手动或通过代码更改重新启动服务器引起的。

答案 1 :(得分:1)

诀窍是生成WSGIDaemonProcess的多个实例来处理进入Apache的所有请求。甚至可能在这些进程中创建多个线程来同时处理请求(大多数情况下)。您应该尝试保护您的initialize_function(),使其每个进程(或线程)只运行一次,例如通过跟踪它是否已经运行。通常,将操作/资源管理的范围扩展到请求的生命周期可能更好。