django.core.exceptions.AppRegistryNotReady:应用尚未加载。
添加时出现异常:
import signals
在 init .py文件(apps / application / init.py)
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):
....
答案 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
]);
}