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

新手上路,请多包涵

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

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

原文由 ApathyBear 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

原文由 ApathyBear 发布,翻译遵循 CC BY-SA 3.0 许可协议

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 。**

原文由 GrvTyagi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题