允许在第一次请求之前初始化其他python模块(Django + mod_wsgi + apache)

时间:2017-05-12 15:16:55

标签: django apache mod-wsgi python-3.5

我是Web应用程序的新手,最近使用Django + mod_wsgi开发了一个简单的演示系统。 该项目看起来像这样:

django/
    |- manage.py
    |- mysite/
    |    |- url.py
    |    |- setting.py
    |    |- wsgi.py
    |- myapp/
         |- views.py
         |- taggers.py
         |- ...

这是 myapp.conf 配置

WSGIDaemonProcess init python-home=/usr/local/.../3.5.0 python-path=/usr/local/.../django
WSGIProcessGroup init
WSGIImportScript /usr/local/.../django/mysite/wsgi.py process-group=init application-group=%{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /myapp /usr/local/.../django/mysite/wsgi.py
<Directory /usr/local/.../django/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

这个演示的功能非常简单。给出一个输入,按一下“计算”&#39;按钮,使用预先加载的机器学习模型计算结果,该模型在 views.py 的开头加载。加载机器学习模型将涉及其他python模块,例如 sklearn 以及位于同一目录中的一些自制模块,例如 tagger.py 。当我使用&#39; python3 manage.py runserver&#39;测试这个演示时,一切都很顺利。 Django首先将机器学习模型加载到RAM,这非常耗时,并等待传入​​的请求然后计算。

但是当我使用mod_wsgi + apache时,我注意到当我启动apache时,只执行 wsgi.py 。在通过浏览器首次访问此演示系统之前,未加载机器学习模型(这意味着尚未导入)。即使在第一次请求后一切都很好,我的意思是没有必要为每次计算加载机器学习模型,我仍然希望在apache启动后立即自动加载机器学习模型。 我看到有人在谈论伪造第一个请求,但我真的很想知道是否有其他解决方案,例如修改 wsgi.py

总结我的问题。

  1. 如何修改默认的 wsgi.py 以导入views.py以便预加载机器学习模型(直接导入wsgi.py中的views.py会导致错误说明类似于未安装的应用程序&#39;)

  2. 如果我别无选择,只能伪造请求,我应该在哪里以及如何编写请求。

  3. 非常感谢。

1 个答案:

答案 0 :(得分:0)

丹尼尔在评论中说,并将预先加载任何数据的代码移动到一个单独的模块中,并在加载时从wsgi.py脚本文件中的全局范围调用它。

您正在使用的配置将在启动进程时预加载wsgi.py。您可以将配置简化为:

WSGIDaemonProcess init python-home=/usr/local/.../3.5.0 python-path=/usr/local/.../django
WSGIScriptAlias /myapp /usr/local/.../django/mysite/wsgi.py process-group=init application-group=%{GLOBAL}
<Directory /usr/local/.../django/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

process-group指令上同时使用application-groupWSGIScriptAlias选项也会触发在处理开始时强制预加载wsgi.py脚本文件,并且您不会需要单独的WSGIImportScript