django.core.exceptions.AppRegistryNotReady:尚未加载应用.文件初始化

Abd*_*iem 3 python django signals receiver

django.core.exceptions.AppRegistryNotReady:尚未加载应用.

当我添加时出现异常:

  1. import signalsinit .py文件中(apps/application/init.py)

  2. from models import Review 在signals.py文件中(apps/application/signals.py)

我希望在模型Review中插入时发送http请求.

所以我需要导入Review模型(在__init.py__文件中)来执行以下代码:

@receiver (pre_save, sender = Review)
def my_handler (sender, ** kwargs):
       ....
Run Code Online (Sandbox Code Playgroud)

sch*_*tte 5

在Django的源代码中,这是异常来自的地方:

def check_apps_ready(self):
    """Raise an exception if all apps haven't been imported yet."""
    if not self.apps_ready:
        raise AppRegistryNotReady("Apps aren't loaded yet.")
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它确保每个应用程序都已准备就绪(已加载).通常,当它与信号有关时,通常有两种情况发生.

  • 循环进口

    确保项目中没有.这可能会导致错误.

  • 在加载应用程序之前注册信号

    有关更多信息,请参阅但是,有一件事可以帮助我理解Django如何在幕后工作:

重要的是要理解Django应用程序只是一组与框架的各个部分交互的代码.没有Application对象这样的东西.但是,有一些地方Django需要与已安装的应用程序进行交互,主要用于配置和内省.这就是应用程序注册表为每个已安装的应用程序在AppConfig实例中维护元数据的原因.

因此,你可以做的是重写的一个AppConfig调用的方法AppConfig.ready(),让你可以执行初始化任务,如注册的信号.

# yourApp/__init__.py

default_app_config = 'yourappname.apps.YourAppConfig'

# yourApp/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    name = 'yourappname'

    def ready(self):
        from yourappname import signals
Run Code Online (Sandbox Code Playgroud)

更多的信息

为了便于解释,这是建议的方式,因为Django 1.7+很可能是你的情况.它背后的逻辑是应用程序注册表保存一个布尔值ready,该值True仅在完全填充注册表并调用所有AppConfig.ready()方法之后设置.