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

时间:2018-06-28 11:28:06

标签: python django signals receiver

  

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

添加时出现异常:

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

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

我想在模型Review中插入一个时发送一个http请求。

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

@receiver (pre_save, sender = Review)
def my_handler (sender, ** kwargs):
       ....

1 个答案:

答案 0 :(得分:5)

在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应用程序只是与框架的各个部分进行交互的一组代码。没有像Application对象这样的东西。但是,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,只有在完全填充注册表并调用所有True方法之后,该布尔值AppConfig.ready()才会设置为class SearchController extends Controller { public function search(Request $request, $query = null) { if($query == null) return redirect()->route('home'); $search = Business::where([['title','like','%'.$query.'%'],['status','=',1]]) ->orWhere([['description','like','%'.$query.'%'],['status','=',1]]) ->paginate(10); return view('front.search',[ 'results' => $search, 'query' => $query ]); }