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

Apa*_*ear 54 python django heroku django-settings

我试图将我的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.
Run Code Online (Sandbox Code Playgroud)

这是我的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())
Run Code Online (Sandbox Code Playgroud)

如果它是相关的,我的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)
Run Code Online (Sandbox Code Playgroud)

任何人似乎都能理解这个问题吗?如果是这样,你能解释什么是错的吗?谢谢!

Apa*_*ear 67

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

export DJANGO_SETTINGS_MODULE=mysite.settings
Run Code Online (Sandbox Code Playgroud)

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

heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings --account <your account name> 
Run Code Online (Sandbox Code Playgroud)

在我的具体情况下,我运行了这两个,一切都解决了:

export DJANGO_SETTINGS_MODULE=nirla.settings
heroku config:set DJANGO_SETTINGS_MODULE=nirla.settings --account personal
Run Code Online (Sandbox Code Playgroud)

编辑

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

  • 那么 `os.environ.setdefault("DJANGO_SETTINGS_MODULE", "nirla.settings")` 会被忽略吗? (6认同)

Grv*_*agi 39

Django的权威指南:Web开发完成:

如果你之前使用过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.
我们鼓励您在这些示例中使用python manage.py shell,以便最大限度地减少调整和配置的数量.

  • 感谢那。虽然 django shell 抛出了同样的错误,但我最终解决了这个问题。我在一个特殊情况下,我的代码库中没有 `settings.py` 文件/模块,而是一个 `settings` 包/文件夹。这个包包含一个 `__init__.py` 文件,其中包含 `settings.py` 的所有常规内容,以及在 __init__ 中导入的其他本地设置文件。所以我不得不配置如下:`export DJANGO_SETTINGS_MODULE=myappfolder.settings.__init__` (2认同)

小智 23

Django需要您的应用程序特定设置.因为它已经在你的manage.py中了.更快但也许是暂时的解决方案是::

python manage.py shell
Run Code Online (Sandbox Code Playgroud)

  • 这正是我在阅读 [Django 2.0 教程 - 第 5 部分 - 自动化测试](https://docs.djangoproject.com/en/2.0/intro/tutorial05/) 时所需要的。以前,我通过单独输入“python”在我的环境中进入 Python 交互模式。输入“from polls.models import Question”后,这将导致 AppRegistryNotReady 异常。 (2认同)

Zor*_*rro 19

就我而言,是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
Run Code Online (Sandbox Code Playgroud)

  • 在哪个文件中添加这些行? (2认同)
  • 在您要执行的票据上 (2认同)

小智 13

如果您在尝试在服务器上运行 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
        )
    )
})
Run Code Online (Sandbox Code Playgroud)


Sha*_*eel 8

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

  1. 第一组your PYTHONPATH
  2. 然后设置DJANGO_SETTINGS_MODULE
  3. 然后运行django-adminshell命令( 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>
Run Code Online (Sandbox Code Playgroud)

否则python manage.py shell就像魅力一样。


egv*_*gvo 5

我在尝试从 python 控制台导入模型时遇到此错误。我的解决方法:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_app.settings")
django.setup()
Run Code Online (Sandbox Code Playgroud)

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

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

from users.models import UserModel
Run Code Online (Sandbox Code Playgroud)