我们的服务器配置为使用pyramid+sqlalchemy
modwsgi+apache2
应用
我们在金字塔应用的__init__.py
中有一些内容可以创建数据库并预先填充一些测试用户和帐户。它类似于pyramid cookbook example here
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
不会重新运行每个请求
考虑分享关于相同内容的简单易懂的链接:)
答案 0 :(得分:2)
创建数据库和预先填充它的事情不应该进入WSGI应用程序的__init__.py
文件,因为正如您所注意到的,每当您启动服务器时(以及某些其他点),此文件都会运行同样)。
您需要的是一个脚本,可以在需要时从命令行调用。每个框架都提供了自己构建这些框架的方法。在金字塔中,它们被称为console scripts
。 Here您可以找到自己构建文档的文档。
但是,我建议您使用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(),使其每个进程(或线程)只运行一次,例如通过跟踪它是否已经运行。通常,将操作/资源管理的范围扩展到请求的生命周期可能更好。