【问题标题】:Django settings not found when trying to deploy尝试部署时找不到 Django 设置
【发布时间】:2019-05-06 22:22:16
【问题描述】:

我的 Django 应用程序设置在应用程序文件夹内的一个文件夹中,带有 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

上面的两个文件都有配置。

【问题讨论】:

  • 你能发布你的设置吗?
  • 您是否尝试过联系 Divio 的支持人员?
  • 当你在本地环境和云端得到不同的结果时,一个非常有用的调试步骤是run the local server in live configuration。这有助于消除它们之间的一些差异。您在实时配置中是否看到相同的错误?
  • 上面已经发布了更多关于设置的信息。
  • simpris 文件夹中有设置文件吗?

标签: python django divio


【解决方案1】:

你快到了。

Django 如何在 Divio 项目中找到其设置

您对manage.py 的更改允许Dockerfile 执行collectstatic

RUN DJANGO_MODE=build python manage.py collectstatic --noinput

找到正确的设置。实际上,您将DJANGO_SETTINGS_MODULE 环境变量硬编码到manage.py 中。

这将允许任何manage.py 命令找到设置,因此(正如您所发现的)您可以在本地运行该站点。

但是,其他命令需要知道设置在哪里,例如在云部署中使用的start web 命令,或者如果您在本地使用run the local server in live configuration

这些命令依赖于正确设置的DJANGO_SETTINGS_MODULE环境变量,并且可以在.env-local 中本地设置,或者使用控制面板中的环境变量视图为云服务器设置。

但是,以这种方式设置的环境变量仅在从已经构建的映像启动容器时才可用。它们不适用于 Dockerfile 中的 collectstatic 命令,因为在此阶段,映像正在构建

必须两次提供相同的信息是不雅的,尤其是在 Python 模块中硬编码环境变量。

最佳解决方案

事实上,您不需要任一做这些事情。而不是修改manage.py为每个环境自定义环境变量,添加:

ENV DJANGO_SETTINGS_MODULE=app.settings

到 Dockerfile(在执行任何 Django 命令之前)。

这将使变量立即可用,并将其烘焙到图像中,因此从它创建的每个容器都将默认包含该变量。

以这种方式设置的变量仍然可以在每个环境的基础上被覆盖。

【讨论】:

  • 非常感谢。我按照你的建议做了,部署成功了。
  • 感谢您告诉我。请务必将问题标记为已回答,因为这也会对其他人有所帮助。
猜你喜欢
  • 2018-04-10
  • 2021-10-07
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多