配置不当:您必须定义环境变量 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 "/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 路径问题。
第一盘
your PYTHONPATH
然后设置
DJANGO_SETTINGS_MODULE
然后运行
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 运行测试时遇到了这个问题。我使用以下步骤解决了该问题:
您需要安装这个包:
pytest-django
转到
pyproject.toml
文件或创建pytest.ini
文件然后将此代码添加到
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"
:
转至
Preferences (cmd +,)
转到
Terminal
并添加两个环境变量(PYTHONPATH 和 DJANGO_SETTINGS_MODULE)
PYTHONPATH
指向项目根目录的绝对路径。
DJANGO_SETTINGS_MODULE
指向设置文件名(相对于根路径且不带.py
)
请看附图!
解决方案 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
扫码咨询,免费领取项目管理大礼包!