python - 尝试部署时找不到 Django 设置
问题描述
我的 Django 应用程序设置在 app 文件夹内的一个带有init .py 的文件夹中,这在我当前的 VPS 服务器、Pycharm 开发和 Divio 本地开发环境中运行良好。但是,当我尝试将其部署到 Divio 登台时,我得到“ModuleNotFoundError:没有名为‘settings’的模块”。为什么是这样?
管理.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
找到正确的设置。实际上,您将DJANGO_SETTINGS_MODULE
环境变量硬编码到manage.py
.
这将允许任何manage.py
命令查找设置,因此(正如您所发现的)您可以在本地运行该站点。
但是,其他命令也需要知道设置在哪里,例如start web
在云部署中使用的命令,或者如果您在实时配置中运行本地服务器,则在本地。
这些命令依赖于正确设置的DJANGO_SETTINGS_MODULE
环境变量,可以在本地设置,或者使用控制面板中的环境变量.env-local
视图为云服务器设置。
但是,以这种方式设置的环境变量仅在从已构建的映像启动容器时才可用。它们将不适用于collectstatic
Dockerfile 中的命令,因为在此阶段正在构建映像。
必须两次提供相同的信息是不雅的,尤其是在 Python 模块中硬编码环境变量。
最佳解决方案
事实上,你不需要做这两件事。不要为每个环境修改manage.py
和自定义环境变量,而是添加:
ENV DJANGO_SETTINGS_MODULE=app.settings
到 Dockerfile(在执行任何 Django 命令之前)。
这将使变量立即可用,并将其烘焙到图像中,以便从它创建的每个容器默认包含该变量。
以这种方式设置的变量仍然可以在每个环境的基础上被覆盖。
推荐阅读
- python - 计算时间序列中同一个月之间的平均值
- sql - 创建表但在字段定义中出现语法错误
- jetbrains-ide - JetBrains Rider - “到处搜索”命令与 Shift+Shift 触发的命令不同
- node.js - npm init 脚本不运行。如何解决?
- r - 给定不同的开始和结束日期,找出每个变量的每日平均值
- go - go-pg got 没有关系 认为我的桌子上有关系
- java - 在 for 循环中使用时无法从 Retrofit 获取数据
- reactjs - 无法使用钩子通过导入反应组件进行映射
- javascript - 如何将 Puppeteer 部署到 Heroku?
- java - 如何在 Nebula ospackage 中使用带有特定 rpm 版本的 `requires` 指令?