启用可在第一次请求前初始化其他Python模块(django+mod_wsgi+apache) [英] enable to initialize other python module before first request (Django + mod_wsgi + apache)
问题描述
我对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>
此演示的功能非常简单。在给定输入的情况下,按下"计算"按钮,使用预加载的机器学习模型计算结果,该模型在views.py的开头加载。加载机器学习模型将涉及到其他Python模块,如skLearning,以及位于同一目录下的一些自制模块,如tagger.py。当我使用‘python3made.py runserver’测试这个演示时,一切都很顺利。Django首先将机器学习模型加载到RAM中,这非常耗时,并等待传入的请求,然后进行计算。
但当我使用mod_wsgi+apache时,我注意到当我启动apache时,只执行wsgi.py。直到第一次通过浏览器访问此演示系统时,才加载机器学习模型(这意味着尚未导入views.py)。即使在第一次请求后一切看起来都很好,我的意思是不需要为每一次计算加载机器学习模型,但我仍然希望在Apache启动后立即自动加载机器学习模型。 我看到有人谈论伪造第一个请求,但我真的很想知道是否有其他解决方案,如修改wsgi.py。
总结我的问题。
我应该如何修改默认的wsgi.py以导入views.py以预加载机器学习模型(直接导入wsgi.py中的views.py将导致类似于‘应用程序未安装’的错误)
如果我别无选择,只能伪造请求,我应该在哪里以及如何编写它。
非常感谢。
推荐答案
按照丹尼尔在注释中所说的做,将预加载任何数据的代码移动到单独的模块中,并在加载脚本文件时从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>
在WSGIScriptAlias
指令上同时具有process-group
和application-group
选项还会在进程启动时触发wsgi.py
脚本文件的强制预加载,并且您不需要单独的WSGIImportScript
。
这篇关于启用可在第一次请求前初始化其他Python模块(django+mod_wsgi+apache)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!