【问题标题】:ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings配置不当:您必须在访问设置之前定义环境变量 DJANGO_SETTINGS_MODULE 或调用 settings.configure()
【发布时间】:2014-11-22 19:07:41
【问题描述】:

我试图配置我的 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())

如果相关,我的 ma​​nage.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)

似乎有人能理解这里的问题吗?如果是这样,你能解释一下哪里出了问题吗?

【问题讨论】:

    标签: python django django-settings


    【解决方案1】:

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

    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】:

    来自The Definitive Guide to Django: Web Development Done Right

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

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

    如果您好奇,下面是它在幕后的运作方式。 Django 寻找一个名为DJANGO_SETTINGS_MODULE 的环境变量,它应该设置为你的settings.py 的导入路径。例如,DJANGO_SETTINGS_MODULE 可能设置为 'mysite.settings',假设 mysite 在您的 Python 路径上。

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

    【讨论】:

    • 谢谢。虽然 django shell 抛出了同样的错误,但我最终解决了这个问题。我在一个特殊情况下,我的代码库中没有settings.py 文件/模块,而是settings 包/文件夹。这个包包含一个__init__.py 文件,其中包含settings.py 的所有常规内容,以及其他本地设置文件,在init 中导入。所以我不得不配置如下:export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__
    • 谢谢,您的评论很有启发性。我正在用 Django 开发一个应用程序,我开发了一个 .py 脚本来将数据从 Excel 工作表上传到模型中。在我的 settings.py 开头,我添加了您建议的两行,即“从 django.conf 导入设置”、“settings.configure()”。但是当我运行它时,我的控制台返回“django.core. exceptions.AppRegistryNotReady:应用程序尚未加载”,我不明白为什么。这是我的脚本stackoverflow.com/questions/58305225/…
    【解决方案3】:

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

    python manage.py shell
    

    【讨论】:

    • 这正是我在浏览Django 2.0 Tutorial - Part 5 - Automated testing 时所需要的。以前,我通过单独键入python 在我的环境中进入 Python 交互模式。这会在输入 from polls.models import Question 后导致 AppRegistryNotReady 异常。
    • 谢谢,我认为django-admin shellpython 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
    

    【讨论】:

    • 在哪个文件中添加这些行?
    • 在你要执行的脚本上
    • 我认为没有必要添加最后一行from django.core.management import call_command
    【解决方案5】:

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

    1. 首先设置您的 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 就像魅力一样。

    【讨论】:

      【解决方案6】:

      如果您在尝试在服务器上运行 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
              )
          )
      })
      

      【讨论】:

      • 它说:ModuleNotFoundError: No module named 'api_backend'
      【解决方案7】:

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

      *基于此tutorial

      【讨论】:

      • 警告:config:push 不是 heroku 命令。你的意思是配置:添加? [是/否]:是!用法:heroku config:set KEY1=VALUE1 [KEY2=VALUE2 ...] !必须指定 KEY 和 VALUE 才能设置。
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

          解决方案

          1. pipenv shell
          2. python manage.py shell
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-23
            • 2020-03-19
            • 2017-01-01
            • 1970-01-01
            相关资源
            最近更新 更多