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

时间:2014-09-28 06:00:13

标签: 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.

这是我的 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)

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

10 个答案:

答案 0 :(得分:62)

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

答案 1 :(得分:36)

来自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',假设您的Python路径上有mysite。

     

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

答案 2 :(得分:17)

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

python manage.py shell

答案 3 :(得分:8)

在我的情况下,使用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

答案 4 :(得分:3)

就我而言,这是一个 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 就像魅力一样。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

确保将python路径正确设置到您的项目目录。

答案 9 :(得分:0)

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