我正在将 Django 应用程序从 modWSGI 转换为 Gunicorn/NGINX。我有一些从 modwsgi 文件运行的 django 代码,以确保它在服务器启动时运行。我试图弄清楚如何让它在 Gunicorn 启动时工作。
免责声明 - 我想要访问的代码是一个穷人的缓存,它处理来自数据库的数据并将其存储为一种对我稍后在 Django 应用程序中所做的许多事情都很友好的格式。 与使用缓存解决方案相比,这个问题与此方法的优点无关。
这是我在 mod-WSGI 中运行得很好的代码:
sys.path.append('/src/accx/navigation')
from navigation.views import rebuild_cache_all
rebuild_cache_all()
其中“accx”是 Django 项目,“navigation”是 Django 应用程序。
现在,我正在尝试使用 Gunicorn 来做同样的事情。
def when_ready(server):
from navigation.views import rebuild_cache_all
rebuild_cache_all()
我还尝试在此代码的各个位置附加到 sys.path,但无论我做什么,我都会收到以下错误:
ImportError: No module named navigation.views
我错过了一些明显的东西吗?我会以错误的方式解决这个问题吗?任何和所有的指导表示赞赏!
.............回答......
在输入上述问题后,我正在仔细阅读其他一些与我的“相关”的gunicorn问题问题,但没有出现在我的搜索中。在这样做的同时,我发现了我的问题。
尾随斜线!
尝试添加到 gunicorn 中的 sys.path 时,我没有使用一个。一旦我解决了这个问题,gunicorn 开始抱怨它丢失了它的 Django_settings_module,所以我最终也不得不提供它。
这是我现在可以使用的:
import sys,os
if not '/src/accx-venv/' in sys.path:
sys.path.insert(0,'/src/accx-venv/')
os.environ["DJANGO_SETTINGS_MODULE"] = "accx.settings"
def when_ready(server):
if not '/src/accx-venv/accx/' in sys.path:
sys.path.insert(0,'/src/accx-venv/accx/')
from navigation.views import rebuild_cache_all
rebuild_cache_all()
可能还有另一种更清洁的方法,但这让我工作。