不正确配置: 在访问设置之前,必须定义环境变量 DJANGO_SETTING_MODULE 或调用 setings.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())

如果有关系的话,我的 经理人 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)

有人能理解这个问题吗?如果是这样,你能好心解释一下是怎么回事吗?

288026 次浏览

我认为 设置模块必须以某种方式设置,所以我查看了 文件(链接更新) ,发现:

export DJANGO_SETTINGS_MODULE=mysite.settings

虽然如果您在 heroku 上运行服务器,这还不够,但是您还需要在 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/active 并在代码底部添加一行: set DJANGO_SETTINGS_MODULE=mysite.settings来自动化这个过程。从现在开始,每次你激活虚拟环境,你将使用该应用程序的设置。

来自 < em > Django 通用指南: 网络开发完美无缺 :

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

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

如果你好奇,这就是它在幕后的工作原理。Django 寻找一个名为 DJANGO_SETTINGS_MODULE的环境变量,它应该被设置为 setings.py 的导入路径。例如,假设 mysite 在 Python 路径上,DJANGO_SETTINGS_MODULE可能被设置为 'mysite.settings'

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

创建一个 。 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: http://github.com/ddollar/heroku-config.git将其发布到 Heroku

$ heroku plugins:install git://github.com/ddollar/heroku-config.git
$ heroku config:push

这样可以避免更改 viralenv 文件。

基于 教程 *

Django 需要特定于应用程序的设置。因为它已经在你的 manage.py里面了,只要使用它。更快但或许是暂时的解决方案是:

python manage.py shell

如果使用本地服务器,请使用 python manage.py shell运行 Django shell。它将带您进入 Django python 环境,您就可以开始了。

在我的例子中,使用 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

在我的案例中,这是一个 Python 路径问题。

  1. 首先设置 PYTHONPATH
  2. 然后设置 DJANGO _ SETTING _ 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的工作像魅力。

当我在 admin.py 中设置我的 list_display = ('name',)时,我发现了这个错误,我把它改成了 list_display = ('name','date'),它工作了。

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

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

解决方案

1. pipenv shell
2. python manage.py shell

我进口的方式不对。

首先,我导入了 django 的模型(在声明文件使用 django 之前)

import pika, json, os, django
from products.models import Product


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "admin.settings")
django.setup()

但是后来我改变了导入如下,它工作(基本上声明文件使用 django,然后导入模型和其他应用程序)

import pika, json, os, django


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "admin.settings")
django.setup()


from products.models import Product

我在尝试从 Python 控制台导入模型时出现了这个错误:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_app.settings")
django.setup()

my_app.settings是到你的 settings.py的路径

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

from users.models import UserModel