如何解决 Django + uWSGI + nginx 堆栈的 "no python application found check your startup logs" 错误

How solve"no python application found check your startup logs" error for Django + uWSGI + nginx stack

我在 ubuntu 16.04 上使用带有 uWSGI 和 nginx 的 Django 1.10,并使用 ansible 部署我的应用程序。我的项目没有默认结构,但很常见(为此感谢 Two scoopce :)。 我使用拆分开发和生产设置和配置文件夹而不是 'name' 项目文件夹。它看起来像这样:

|-- config
|   |-- __init__.py
|   |-- settings
|   |   |-- __init__.py
|   |   |-- base.py
|   |   `-- dev.py
|   |-- urls.py
|   |-- wsgi_dev.py
|   `-- wsgi_production.py
|-- manage.py
`-- requirements.txt

我的 production.py 从 ansible 生成并安全加密并定位在 config/settings.

使用此配置我得到 "no python application found check your startup logs"。 Uwsgi 看不到我的应用程序。

( {{ }} 这是 ansible 的 jinja2 语法 )

/etc/uwsgi/sites/{{ project_name }}

[uwsgi]
chdir = {{ django_root }}
home = /home/{{ project_user }}/venvs/{{ project_name }}
module = config.wsgi_production:application

master = true
processes = 5

socket = /run/uwsgi/{{ project_name }}.sock
chown-socket = {{ project_user }}:www-data
chmod-socket = 660
vacuum = true

几个星期后,我可以在我的 wsgi.py 中找到问题。它的常见解决方案是将 os.environ['ENV'] 用于 DJANGO_SETTINGS_MODULE,但对于不同的用户和权限,它不起作用。

如果您在 wsgi.py 文件中使用如下内容:

os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings." + os.environ["ENV"]

并且 no python application found 有问题 - 拆分您的 wsgi 文件。我可以捕捉到 os.environ["ENV"] return 空字符串。我为我的所有用户添加它,使用源等。但是 uwsgi 在 emperior 模式下看不到它。 你应该使用 wsgi_dev.pywsgi_production.py,你可以在其中写出像 os.environ["DJANGO_SETTINGS_MODULE"] = "config.settings.production" 这样的东西。不是很优雅,但很好地解决了这个问题。

为了使用拆分 wsgi 你可以在 wsgi.py

中写这样的东西
import os

from django.core.wsgi import get_wsgi_application

if os.environ.get('DEV') is True:
   os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.dev")
else:
   os.environ.setdefault("DJANGO_SETTINGS_MODULE", 
   "config.settings.production")

application = get_wsgi_application()