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


83

我试图将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)

有人可以在这里了解这个问题吗?如果是这样,您能否以友善的态度解释什么是错的?谢谢!

Answers:


82

我认为必须以某种方式设置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在代码底部添加line:来自动化该过程。从现在开始,每次激活虚拟环境时,都将使用该应用程序的设置。


那么os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")被忽略了吗?
Matej J

62

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将为您进行设置。**


2
感谢那。尽管django shell抛出了相同的错误,但我最终解决了该问题。我遇到的特殊情况是,settings.py我的代码库中没有文件/模块,但是有一个settings包/文件夹。该软件包包含一个__init__.py文件,该文件包含init中settings.py导入的所有常规文件以及其他本地设置文件。因此,我必须进行如下配置:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
美联储Zee

谢谢,您的评论很有启发性。我正在Django中开发应用程序,并且开发了.py脚本将数据从excel工作表上传到模型中。在settings.py的开头,我添加了您建议的两行,即“从django.conf导入设置”,“ settings.configure()”。但是当我运行它时,控制台返回“ django.core”。 exceptions.AppRegistryNotReady:应用尚未加载”,我不明白为什么。这里是我的脚本stackoverflow.com/questions/58305225/...
Tms91

38

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

python manage.py shell

这正是我完成Django 2.0教程-第5部分-自动化测试时所需的。以前,我是通过python单独输入在环境中进入Python交互模式的。键入后,将导致AppRegistryNotReady异常from polls.models import Question
datalifenyc

6

就我而言,是使用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

3

创建一个.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

这样您可以避免更改virtualenv文件。

*基于本教程


0

如果使用本地服务器,请使用运行Django shell python manage.py shell。它将带您进入Django python环境,一切顺利。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.