配置不当:您必须定义环境变量 DJANGO_SETTINGS_MODULE 或在访问设置之前调用 settings.configure()

2025-02-27 09:06:00
admin
原创
78
摘要:问题描述:我试图配置我的 Django 项目以部署到 Heroku。我收到以下错误,但我真的不知道如何修复它。以下是完整的回溯和错误:22:46:15 web.1 | Traceback (most recent call last): 22:46:15 web.1 | File "/Use...

问题描述:

我试图配置我的 Django 项目以部署到 Heroku。我收到以下错误,但我真的不知道如何修复它。

以下是完整的回溯和错误:

22:46:15 web.1  | Traceback (most recent call last):
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/arbiter.py", line 495, in spawn_worker
22:46:15 web.1  |     worker.init_process()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/workers/base.py", line 106, in init_process
22:46:15 web.1  |     self.wsgi = self.app.wsgi()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/base.py", line 114, in wsgi
22:46:15 web.1  |     self.callable = self.load()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 62, in load
22:46:15 web.1  |     return self.load_wsgiapp()
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load_wsgiapp
22:46:15 web.1  |     return util.import_app(self.app_uri)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/gunicorn/util.py", line 354, in import_app
22:46:15 web.1  |     __import__(module)
22:46:15 web.1  |   File "/Users/nir/nirla/nirla/wsgi.py", line 12, in <module>
22:46:15 web.1  |     from dj_static import Cling
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/dj_static.py", line 7, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.handlers import StaticFilesHandler as DebugHandler
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 8, in <module>
22:46:15 web.1  |     from django.contrib.staticfiles.views import serve
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/contrib/staticfiles/views.py", line 13, in <module>
22:46:15 web.1  |     from django.views import static
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/views/static.py", line 96, in <module>
22:46:15 web.1  |     template_translatable = ugettext_noop("Index of %(directory)s")
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 65, in gettext_noop
22:46:15 web.1  |     return _trans.gettext_noop(message)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 52, in __getattr__
22:46:15 web.1  |     if settings.USE_I18N:
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 54, in __getattr__
22:46:15 web.1  |     self._setup(name)
22:46:15 web.1  |   File "/Users/nir/nirla/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 47, in _setup
22:46:15 web.1  |     % (desc, ENVIRONMENT_VARIABLE))
22:46:15 web.1  | ImproperlyConfigured: Requested setting USE_I18N, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

这是我的wsgi.py文件:

import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings") #nirla is the name of the project


application = Cling(get_wsgi_application())

如果相关的话,我的manage.py文件:

import os
import sys

    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")
    
        from django.core.management import execute_from_command_line
    
        execute_from_command_line(sys.argv)

有人能理解这个问题吗?如果能,您能解释一下问题出在哪里吗?


解决方案 1:

我认为必须以某种方式设置DJANGO_SETTINGS_MODULE ,因此我查看了文档(链接已更新)并发现:

export DJANGO_SETTINGS_MODULE=mysite.settings

虽然如果你在 heroku 上运行服务器,这还不够,你还需要在那里指定它。像这样:

heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings --account <your account name> 

在我的具体情况下,我运行了这两个并且一切顺利:

export DJANGO_SETTINGS_MODULE=nirla.settings
heroku config:set DJANGO_SETTINGS_MODULE=nirla.settings --account personal

编辑

我还想指出,每次关闭或重新启动虚拟环境时,您都必须重新执行此操作。相反,您应该通过转到 venv/bin/activate 并set DJANGO_SETTINGS_MODULE=mysite.settings在代码底部添加行:来自动执行该过程。从现在开始,每次激活虚拟环境时,您都将使用该应用程序的设置。

解决方案 2:

摘自《Django 权威指南:正确完成 Web 开发》

如果你以前使用过 Python,你可能会想知道为什么我们要运行python manage.py shell而不是仅仅运行python。这两个命令都将启动交互式解释器,但是该manage.py shell命令有一个关键区别:在启动解释器之前,它会告诉 Django 要使用哪个设置文件。

用例:Django 的许多部分(包括模板系统)都依赖于您的设置,除非框架知道要使用哪些设置,否则您将无法使用它们。

如果您很好奇,下面是它在幕后的工作原理。Django 会查找名为 的环境变量DJANGO_SETTINGS_MODULE,该变量应设置为您的 settings.py 的导入路径。例如,假设 mysite 位于您的 Python 路径中,DJANGO_SETTINGS_MODULE则可能设置为。'mysite.settings'

当您运行时python manage.py shell,命令会DJANGO_SETTINGS_MODULE为您完成设置。**

解决方案 3:

Django 需要您的应用程序特定设置。由于它已经在您的 中manage.py,因此只需使用它即可。更快但可能是暂时的解决方案是:

python manage.py shell

解决方案 4:

就我的情况而言,模块的使用call_command出现了问题。

我添加了set DJANGO_SETTINGS_MODULE=mysite.settings,但没有用。

我终于找到了:

在脚本顶部添加这些行,顺序很重要。

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

import django
django.setup()

from django.core.management import call_command

解决方案 5:

如果您因为在服务器上尝试运行 daphne 时遇到错误而来到此地,那么这里就是您的答案。

像这样更改你的 asgi.py 文件。

import os
from django.conf.urls import url

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mc_backend.settings')

from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
django_asgi_app = get_asgi_application()

from channels.auth import AuthMiddlewareStack   
import api_backend.routing


application = ProtocolTypeRouter({
    "http": django_asgi_app,
    'websocket': AuthMiddlewareStack(
        URLRouter(
            api_backend.routing.websocket_urlpatterns
        )
    )
})

解决方案 6:

就我而言,这是一个 Python 路径问题。

  1. 第一盘your PYTHONPATH

  2. 然后设置DJANGO_SETTINGS_MODULE

  3. 然后运行django-admin​​shell 命令(django-admin dbshell

(venv) shakeel@workstation:~/project_path$ export PYTHONPATH=/home/shakeel/project_path
(venv) shakeel@workstation:~/project_path$ export DJANGO_SETTINGS_MODULE=my_project.settings
(venv) shakeel@workstation:~/project_path$ django-admin dbshell
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite>

否则python manage.py shell就会像魔法一样起作用。

解决方案 7:

尝试从 Python 控制台导入模型时出现此错误。我的解决方法:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_app.settings")
django.setup()

my_app.settings是通往你的道路settings.py

然后您可以导入您的模型:

from users.models import UserModel

解决方案 8:

创建一个.env文件,它将保存你的凭证在你的项目根目录下,并且不进行版本控制:

$ echo ".env" >> .gitignore

在 .env 文件中,添加变量(根据您的安装进行调整):

$ echo "DJANGO_SETTINGS_MODULE=myproject.settings.production"> .env
#50 caracter random key
$ echo "SECRET_KEY='####'">> .env

要使用它们,请将其放在 production.py 设置文件的顶部:

import os

env = os.environ.copy()
SECRET_KEY = env['SECRET_KEY']

使用这个 gem 将其发布到 Heroku:http://github.com/ddollar/heroku-config.git

$ heroku plugins:install git://github.com/ddollar/heroku-config.git
$ heroku config:push

这样您就避免更改虚拟环境文件。

*基于本教程

解决方案 9:

我已经使用pipenv来管理 django 项目的虚拟环境。

解决方案

1. pipenv shell
2. python manage.py shell

解决方案 10:

我在使用 pytest 和 poetry 运行测试时遇到了这个问题。我使用以下步骤解决了该问题:

  1. 您需要安装这个包:pytest-django

  2. 转到pyproject.toml文件或创建pytest.ini文件

  3. 然后将此代码添加到pyproject.toml =>[tool.pytest.ini_options]

DJANGO_SETTINGS_MODULE = "your_project_name.settings"

参考 - pytest-django 文档

解决方案 11:

如果您使用的是本地服务器,请使用 运行 Django shell python manage.py shell。它将带您进入 Django python 环境,然后您就可以开始了。

解决方案 12:

我的导入方式错误。

首先我导入了没有的django模型(在我声明文件使用django之前)

import pika, json, os, django
from products.models import Product

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "admin.settings")
django.setup()

但后来我改变了导入方式如下并且它可以工作(基本上声明文件使用 django 然后导入模型和其他应用程序)

import pika, json, os, django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "admin.settings")
django.setup()

from products.models import Product

解决方案 13:

当我在 admin.py 中设置时我发现了这个错误,list_display = ('name',)我将其更改为,list_display = ('name','date')并且它起作用了。

解决方案 14:

对我来说,我只需要通过以下方式引入缺失的变量"Preferences" => "Terminal" => "Environment variables"

  1. 转至Preferences (cmd +,)

  2. 转到Terminal并添加两个环境变量(PYTHONPATH 和 DJANGO_SETTINGS_MODULE)

PYTHONPATH指向项目根目录的绝对路径。

DJANGO_SETTINGS_MODULE指向设置文件名(相对于根路径且不带.py

请看附图!

IT科技

解决方案 15:

正确的命令python manage.py runserver
当我尝试Django-admin runserver时,我得到了上述错误。后来意识到我的错误

解决方案 16:

配置 Django 设置的另一种简单方法是在运行命令时指定它们manage.py

例子:

python manage.py test $(MODULE) --settings=$(SETTINGS)

然后从manage.py脚本中删除此行:os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nirla.settings')

$MODULE这将告诉 Django使用指示的设置文件对模块运行测试$SETTINGS

在这种情况下$SETTINGS可能是这样的nirla.settings

当然,这只有在使用manage.py脚本运行 Django 应用程序时才有效。

例如,如果您想通过其他方式运行系统,UWSGI那么您将需要指定要UWSGI使用哪个设置文件。

例子:

  • USGI服务文件

[Unit]
Description=uWSGI django service

[Service]
ExecStart=/opt/your_service_name/env/bin/uwsgi --ini /opt/your_service_name/your_service_name.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

并且/opt/your_service_name/your_service_name.ini文件应该是这样的:

[uwsgi]
chdir = /opt/your_service_name

# env variables
env = DJANGO_SETTINGS_MODULE=your_service_name.settings.production
env = STATIC_ROOT=/opt/your_service_name/var/static
env = MEDIA_ROOT=/opt/your_service_name/var/media

module = your_service_name.wsgi:application

# env dir config
home = /opt/powerlex/env

socket = /tmp/socket
master = true
workers = 2
chmod-socket=666

# if app not found uwsgi is not starting
need-app = True

正如你在这一行看到的,env = DJANGO_SETTINGS_MODULE=your_service_name.settings.production我们配置了要使用的设置

PS:上面的UWSGI配置仅仅是一个示例,因此我们不期望它能按原样工作。

解决方案 17:

编辑可能位于 projects\projects 文件夹中的 Settings.py 文件,并添加您的应用程序名称,如下例所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'YourAppsName'
]

解决方案 18:

我的情况是直接进入ipython环境这样解决的,如果shell环境和项目之间一直要有联系就好了。

解决此问题的方法:

1-我首先安装了 ipython

pip install ipython

2-然后使用以下命令进入ipython环境:

python manage.py shell

不要单独运行 ipython 命令。

其实,如果你进入ipython环境但没有运行的话,我们的项目和shell环境之间的连接就没有建立起来,在导入我们的项目文件时就会遇到这个错误。

解决方案 19:

我找到了!

对于Windows 用户,set DJANGO_SETTINGS_MODULE=your_project.settings每次激活虚拟环境后,

请添加以下代码部分,而不是命令

$env:DJANGO_SETTINGS_MODULE = "your_project.settings"

在您的文件中Activate.ps1,在下面的代码部分之后

# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
# that there is an activated venv.
$env:VIRTUAL_ENV = $VenvDir

喜欢:

# ...
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
# that there is an activated venv.
$env:VIRTUAL_ENV = $VenvDir

# Set the DJANGO_SETTINGS_MODULE environment variable
$env:DJANGO_SETTINGS_MODULE = "your_project.settings"

# ...

your_project`settings.py`是文件所在的项目名称。

解决方案 20:

如果在构建文件中运行除 manage.py 文件之外的 Python 脚本导致了问题,

尝试安装 django-extensions。

然后,将其添加到已安装的应用程序

INSTALLED_APPS = [
...
'django_extensions',
...
]
  • 在根级别(manage.py 级别)创建一个名为 scripts 的目录。

  • 创建一个init .py 使其成为一个 python 包。

  • 在该文件夹内创建您想要的脚本。

  • 定义一个名为 run() 的函数并执行它。

  • 例如,脚本文件名是script1.py,那么

  • 运行-python manage.py runscript script1

  • 这将执行该脚本。

在 build.sh 中包含命令

详细解释见
django-extensions doc

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3592  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2442  
  敏捷每日站会作为敏捷项目管理中的关键环节,对于提升产品生命周期管理(PLM)效率有着不可忽视的作用。PLM涵盖了产品从概念产生到最终报废的全过程管理,涉及众多环节与人员,而每日站会能够通过优化沟通机制,让信息在团队中快速、准确地流动,从而推动整个PLM流程更加顺畅、高效。接下来,我们将深入探讨如何通过四步优化沟通机制,...
plm系统   17  
  在企业的发展进程中,产品生命周期管理(PLM)项目管理至关重要,而数据驱动决策则是提升PLM项目管理效能的关键手段。通过运用合适的分析模型,企业能够从海量数据中挖掘有价值的信息,为决策提供有力支撑,进而优化产品全生命周期的各个环节。以下将详细介绍助力PLM项目管理实现数据驱动决策的5大分析模型。需求分析模型需求分析是P...
plm系统功能介绍   19  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与运营中扮演着至关重要的角色。它涵盖了从产品概念设计到退役的全流程管理,确保产品数据的有效整合与协同。然而,在复杂多变的商业环境中,黑天鹅事件随时可能降临,给企业带来难以预估的冲击。这些意外事件具有不可预测性、极大的影响力和事后的可解释性等特点,会对PLM系统的正常运...
plm系统的主要功能模块   16  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用