(django) 为什么在将应用程序添加到 INSTALLED_APPS 时出现错误,但在导入时却没有?
(django) Why do I get an error when adding app to INSTALLED_APPS but not when just importing?
我用抽象 类、一些实用函数、我常用的模板标签等编写了一个应用程序。
有些时候我看到了对可重复使用的应用程序执行此操作的推荐方法。 (这一切都是相互关联的。) 为什么不呢?这似乎是个好主意。所以我让这些东西成为应用程序的一部分。由于该应用程序没有 url、视图,也没有正常的结构,因此它更像是一个 python 模块。 (但它需要 django。)
当我以正常方式导入此应用程序时(文件顶部有 import myapp
),它工作正常。
寻找我在官方 django 教程第 8 部分中看到的建议在 INSTALLED_APPS
中导入应用程序的最佳实践 settings.py
。由于我将我的 utils 模块作为一个应用程序,我想我可以在 INSTALLED_APPS
中添加一行。就像这样:myapp.apps.MyappConfig
.
我的项目结构:
project
|-... [multiple normal apps]
|-myapp [which is my utils app]
|-project [the inner folder]
|-... [some other stuff]
如您所见,实用程序应用程序 myapp
仍然是项目的一部分(并且尚未成为可重用的应用程序。)
但是当我将该行添加到 INSTALLED_APPS
时,我得到以下回溯:
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0xb6356adc>
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/commands/runserver.py", line 117, in inner_run
autoreload.raise_last_exception()
File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 250, in raise_last_exception
six.reraise(*_exception)
File "/usr/local/lib/python3.5/dist-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/usr/local/lib/python3.5/dist-packages/django/apps/config.py", line 94, in create
module = import_module(entry)
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "/my_cool_directory/project/myapp/__init__.py", line 1, in <module>
from .models import *
File "/my_cool_directory/project/myapp/models.py", line 8, in <module>
class Publishable(models.Model):
File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 110, in __new__
app_config = apps.get_containing_app_config(module)
File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 247, in get_containing_app_config
self.check_apps_ready()
File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 125, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
我的问题不大,因为我可以正常导入应用程序。我只是好奇:为什么它不按照推荐的方式工作?
- 还有:如何让子模块中的东西可以从顶级模块导入?在apps.py?或者在
__init__.py
?
您不能将模型导入应用的根模块。这是 Django 应用程序框架的局限之一。您需要从 myapp/__init__.py
中删除 from .models import *
行。
Django 首先导入每个已安装应用程序的根模块。这用于设置应用程序配置,这些配置需要在不同应用程序的模型之间设置关系字段。要建立这些关系,必须已加载两个相关应用。
Django 吸取了教训,允许随时导入模型使这个过程变得非常复杂,这引入了一系列难以解决的错误。在 1.7 中,这个过程被大大简化,减少了错误的数量,但在那个简化中,决定在导入任何模型之前必须加载所有应用程序。
我用抽象 类、一些实用函数、我常用的模板标签等编写了一个应用程序。
有些时候我看到了对可重复使用的应用程序执行此操作的推荐方法。 (这一切都是相互关联的。) 为什么不呢?这似乎是个好主意。所以我让这些东西成为应用程序的一部分。由于该应用程序没有 url、视图,也没有正常的结构,因此它更像是一个 python 模块。 (但它需要 django。)
当我以正常方式导入此应用程序时(文件顶部有 import myapp
),它工作正常。
寻找我在官方 django 教程第 8 部分中看到的建议在 INSTALLED_APPS
中导入应用程序的最佳实践 settings.py
。由于我将我的 utils 模块作为一个应用程序,我想我可以在 INSTALLED_APPS
中添加一行。就像这样:myapp.apps.MyappConfig
.
我的项目结构:
project
|-... [multiple normal apps]
|-myapp [which is my utils app]
|-project [the inner folder]
|-... [some other stuff]
如您所见,实用程序应用程序 myapp
仍然是项目的一部分(并且尚未成为可重用的应用程序。)
但是当我将该行添加到 INSTALLED_APPS
时,我得到以下回溯:
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0xb6356adc>
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/core/management/commands/runserver.py", line 117, in inner_run
autoreload.raise_last_exception()
File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 250, in raise_last_exception
six.reraise(*_exception)
File "/usr/local/lib/python3.5/dist-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
File "/usr/local/lib/python3.5/dist-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/usr/local/lib/python3.5/dist-packages/django/apps/config.py", line 94, in create
module = import_module(entry)
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 944, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 665, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "/my_cool_directory/project/myapp/__init__.py", line 1, in <module>
from .models import *
File "/my_cool_directory/project/myapp/models.py", line 8, in <module>
class Publishable(models.Model):
File "/usr/local/lib/python3.5/dist-packages/django/db/models/base.py", line 110, in __new__
app_config = apps.get_containing_app_config(module)
File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 247, in get_containing_app_config
self.check_apps_ready()
File "/usr/local/lib/python3.5/dist-packages/django/apps/registry.py", line 125, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
我的问题不大,因为我可以正常导入应用程序。我只是好奇:为什么它不按照推荐的方式工作?
- 还有:如何让子模块中的东西可以从顶级模块导入?在apps.py?或者在
__init__.py
?
您不能将模型导入应用的根模块。这是 Django 应用程序框架的局限之一。您需要从 myapp/__init__.py
中删除 from .models import *
行。
Django 首先导入每个已安装应用程序的根模块。这用于设置应用程序配置,这些配置需要在不同应用程序的模型之间设置关系字段。要建立这些关系,必须已加载两个相关应用。
Django 吸取了教训,允许随时导入模型使这个过程变得非常复杂,这引入了一系列难以解决的错误。在 1.7 中,这个过程被大大简化,减少了错误的数量,但在那个简化中,决定在导入任何模型之前必须加载所有应用程序。