如何解决 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.py
和 wsgi_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()
我在 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.py
和 wsgi_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()