Skip to main content
 首页 » 编程设计

python之尝试部署时未找到 Django 设置

2024年09月03日36lautakyan007

我的 Django 应用程序设置位于应用程序文件夹内的一个文件夹中,带有 init.py,这在我当前的 VPS 服务器、Pycharm 开发和 Divio 本地开发环境中运行良好。但是,当我尝试将其部署到 Divio staging 时,我得到“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', 
]) 

哪些进口:

通用.py dev_divio.py

上面两个文件都有配置。

请您参考如下方法:

你快到了。

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 命令之前)。

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

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