尝试部署时未找到 Django 设置
Django settings not found when trying to deploy
我的 Django 应用程序设置在应用程序文件夹中的一个文件夹中,带有 init.py,这在我当前的 VPS 服务器上运行良好,Pycharm 开发并在 Divio 本地开发环境中。但是,当我尝试将其部署到 Divio staging 时,我得到 "ModuleNotFoundError: No module named 'settings'"。这是为什么?
Manage.py:
#!/usr/bin/env python
import os
from aldryn_django import startup
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
startup.manage(path=os.path.dirname(os.path.abspath(__file__)))
没有settings.py个文件
文件夹名为设置:
_ 初始化 _.py
from .dev_divio import * # or .dev if you want dev
from .common import *
INSTALLED_ADDONS = [
# <INSTALLED_ADDONS> # Warning: text inside the INSTALLED_ADDONS tags is auto-generated. Manual changes will be overwritten.
'aldryn-addons',
'aldryn-django',
'aldryn-sso',
# </INSTALLED_ADDONS>
]
import aldryn_addons.settings
aldryn_addons.settings.load(locals())
# Application definition
INSTALLED_APPS.extend([
# add your project specific apps here
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
# 'django.contrib.staticfiles',
# 'django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'appname',
])
进口:
common.py
dev_divio.py
以上两个文件都有配置
你快到了。
Django 如何在 Divio 项目中找到它的设置
您对 manage.py
的更改允许 collectstatic
由 Dockerfile 执行:
RUN DJANGO_MODE=build python manage.py collectstatic --noinput
正确找到设置。实际上,你把hard-coded的DJANGO_SETTINGS_MODULE
环境变量改成了manage.py
.
这将允许任何 manage.py
命令找到设置,因此(正如您发现的那样)您可以在本地 运行 站点。
但是,其他命令也需要知道设置在哪里,例如在云部署中使用的start web
命令,或者如果您在本地run the local server in live configuration.
这些命令依赖于 correctly-set DJANGO_SETTINGS_MODULE
环境变量,并且可以在 .env-local
中本地设置,或者对于使用 环境变量的云服务器 在控制面板中查看。
但是,以这种方式设置的环境变量仅在从 已经构建 的图像启动容器时才可用。它们将不可用于 Dockerfile 中的 collectstatic
命令,因为在此阶段映像正在 构建中 .
必须两次提供相同的信息是不雅的,尤其是 hard-code Python 模块中的环境变量。
最佳方案
事实上,您不需要做这些事情中的任何一个。而不是修改manage.py
和为每个环境自定义环境变量,添加:
ENV DJANGO_SETTINGS_MODULE=app.settings
到 Dockerfile(在执行任何 Django 命令之前)。
这将使变量立即可用,并将其烘焙到图像中,以便从中创建的每个容器默认包含该变量。
以这种方式设置的变量仍然可以在 per-environment 的基础上被覆盖。
我的 Django 应用程序设置在应用程序文件夹中的一个文件夹中,带有 init.py,这在我当前的 VPS 服务器上运行良好,Pycharm 开发并在 Divio 本地开发环境中。但是,当我尝试将其部署到 Divio staging 时,我得到 "ModuleNotFoundError: No module named 'settings'"。这是为什么?
Manage.py:
#!/usr/bin/env python
import os
from aldryn_django import startup
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
startup.manage(path=os.path.dirname(os.path.abspath(__file__)))
没有settings.py个文件
文件夹名为设置:
_ 初始化 _.py
from .dev_divio import * # or .dev if you want dev
from .common import *
INSTALLED_ADDONS = [
# <INSTALLED_ADDONS> # Warning: text inside the INSTALLED_ADDONS tags is auto-generated. Manual changes will be overwritten.
'aldryn-addons',
'aldryn-django',
'aldryn-sso',
# </INSTALLED_ADDONS>
]
import aldryn_addons.settings
aldryn_addons.settings.load(locals())
# Application definition
INSTALLED_APPS.extend([
# add your project specific apps here
# 'django.contrib.admin',
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.messages',
# 'django.contrib.staticfiles',
# 'django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'appname',
])
进口:
common.py dev_divio.py
以上两个文件都有配置
你快到了。
Django 如何在 Divio 项目中找到它的设置
您对 manage.py
的更改允许 collectstatic
由 Dockerfile 执行:
RUN DJANGO_MODE=build python manage.py collectstatic --noinput
正确找到设置。实际上,你把hard-coded的DJANGO_SETTINGS_MODULE
环境变量改成了manage.py
.
这将允许任何 manage.py
命令找到设置,因此(正如您发现的那样)您可以在本地 运行 站点。
但是,其他命令也需要知道设置在哪里,例如在云部署中使用的start web
命令,或者如果您在本地run the local server in live configuration.
这些命令依赖于 correctly-set DJANGO_SETTINGS_MODULE
环境变量,并且可以在 .env-local
中本地设置,或者对于使用 环境变量的云服务器 在控制面板中查看。
但是,以这种方式设置的环境变量仅在从 已经构建 的图像启动容器时才可用。它们将不可用于 Dockerfile 中的 collectstatic
命令,因为在此阶段映像正在 构建中 .
必须两次提供相同的信息是不雅的,尤其是 hard-code Python 模块中的环境变量。
最佳方案
事实上,您不需要做这些事情中的任何一个。而不是修改manage.py
和为每个环境自定义环境变量,添加:
ENV DJANGO_SETTINGS_MODULE=app.settings
到 Dockerfile(在执行任何 Django 命令之前)。
这将使变量立即可用,并将其烘焙到图像中,以便从中创建的每个容器默认包含该变量。
以这种方式设置的变量仍然可以在 per-environment 的基础上被覆盖。