【问题标题】:django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. file initdjango.core.exceptions.AppRegistryNotReady:应用程序尚未加载。文件初始化
【发布时间】:2018-12-07 11:18:21
【问题描述】:

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):
       ....

【问题讨论】:

    标签: python django signals receiver


    【解决方案1】:

    在 Django 的 source 中,这是异常的来源:

    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.")
    

    如您所见,请确保每个应用都准备就绪(已加载)。一般来说,当它与信号有关时,通常有两种情况发生。

    • 循环导入

      确保您的项目中没有。这可能会导致错误。

    • 在应用加载前注册信号

      请参阅this 了解更多信息。但是,有助于我理解 Django 在幕后工作的一件事是以下语句:

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

    因此,您可以做的是覆盖称为AppConfig.ready()AppConfig 方法之一,该方法允许您执行初始化任务,例如注册信号。

    # 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
    

    更多信息

    为了解释起见,这是自 Django 1.7+ 以来推荐的做法,这很可能是您的情况。其背后的逻辑是application registry 持有一个布尔值ready,只有在注册表完全填充并且所有AppConfig.ready() 方法都被调用后才设置为True

    【讨论】:

    • 非常感谢您的帮助。最后它起作用了。我尝试使用 App Config。
    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 2016-09-26
    • 2016-01-08
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    相关资源
    最近更新 更多