尝试部署时找不到Django设置

时间:2019-05-06 22:22:16

标签: python django divio

我将Django应用程序设置放在具有 init .py的应用程序文件夹中的文件夹中,这在我当前的VPS服务器,Pycharm开发以及Divio本地开发环境中均能正常工作。但是,当我尝试将其部署到Divio阶段时,出现“ ModuleNotFoundError:没有名为“设置”的模块”。为什么会这样?

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文件

文件夹通过以下方式调用设置:

_ init _.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

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

1 个答案:

答案 0 :(得分:2)

你快到了。

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

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

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

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

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

但是,其他命令 也需要知道设置的位置,例如Cloud部署中使用的start web命令,或者run the local server in live configuration则在本地。 / p>

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

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

必须两次提供相同的信息,尤其是要在Python模块中对环境变量进行硬编码,这是不明智的。

最佳解决方案

事实上,您不需要执行这些操作之一。无需修改manage.py 为每个环境自定义环境变量,而是添加:

ENV DJANGO_SETTINGS_MODULE=app.settings

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

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

以此方式设置的变量仍可以根据每个环境被覆盖。