momo's Blog.

解决django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_AP...

字数统计: 582阅读时长: 3 min
2021/11/08 Share

报错描述

在单独写脚本或者其他需要与Django交互的功能时, 通常会调用 django.setup() 而有时候, 可能一不留神就报错了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Traceback (most recent call last):
File "/usr/local/bin/daphne", line 8, in <module>
sys.exit(CommandLineInterface.entrypoint())
File "/usr/local/lib/python3.6/site-packages/daphne/cli.py", line 170, in entrypoint
cls().run(sys.argv[1:])
File "/usr/local/lib/python3.6/site-packages/daphne/cli.py", line 232, in run
application = import_by_path(args.application)
File "/usr/local/lib/python3.6/site-packages/daphne/utils.py", line 12, in import_by_path
target = importlib.import_module(module_path)
File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "./opsbackend/asgi.py", line 8, in <module>
from consumer import routing
File "./consumer/routing.py", line 4, in <module>
from . import consumers
File "./consumer/consumers.py", line 4, in <module>
from apps.hosts.models import Hosts
File "./apps/hosts/models.py", line 3, in <module>
from apps.business.models import Business
File "./apps/business/models.py", line 5, in <module>
class Business(models.Model):
File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 103, in __new__
app_config = apps.get_containing_app_config(module)
File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 252, in get_containing_app_config
self.check_apps_ready()
File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 134, in check_apps_ready
settings.INSTALLED_APPS
File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 79, in __getattr__
self._setup(name)
File "/usr/local/lib/python3.6/site-packages/django/conf/__init__.py", line 64, in _setup
% (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

问题解决

原本代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mysite/asgi.py
import os
import django

from channels.http import AsgiHandler
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from consumer import routing

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
django.setup()
application = ProtocolTypeRouter({
"http": AsgiHandler(),
# Just HTTP for now. (We can add other protocols later.)
"websocket": AuthMiddlewareStack(URLRouter(routing.websocket_urlpatterns))
})

在原本的代码中, 我当时并没有仔细看到有什么问题。实际上, 设置环境要比导入其他模块提前才行.

也就是说, 需要在os模块下面, 就需要执行 os.environ.setdefaultdjango.setup(). 否则就会出现错误.

正确顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# mysite/asgi.py
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
django.setup()
from channels.http import AsgiHandler
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from consumer import routing


application = ProtocolTypeRouter({
"http": AsgiHandler(),
# Just HTTP for now. (We can add other protocols later.)
"websocket": AuthMiddlewareStack(URLRouter(routing.websocket_urlpatterns))
})
CATALOG
  1. 1. 报错描述
  2. 2. 问题解决
    1. 2.1. 正确顺序