如果没有预热请求,何时在GAE上导入INSTALLED_APPS?

时间:2014-01-20 16:21:34

标签: django-nonrel djangoappengine

djangoappengine.views.warmup在GAE发送预热请求时完成加载所有Django应用程序的工作。如果GAE由于请求峰值或未启用预热服务而未发送预热请求,那么何时导入INSTALLED_APPS?我看到djangoappengine.deferred.handler.application加载所有INSTALLED_APPS,但djangoappengine.main.application不加载。

我遇到的问题是,如果没有预热请求,那么第一个加载请求处理程序或后续请求处理程序可能需要一个尚未注册的非搜索模型字段,因为搜索未通过INSTALLED_APPS导入因此autodiscover()还没有运行。

我的设置MIDDLEWARE_CLASSES确实有'autoload.middleware.AutoloadMiddleware',所以我认为它可以在没有预热的情况下加载,但事实并非如此。

在处理任何请求之前,确保所有内容都已加载的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

解决方案是在网站的urls.py中调用search.autodiscover(),除了在INSTALLED_APPS中进行自动加载和搜索,以及在MIDDLEWARE_CLASSES中使用autoload.middleware.AutoloadMiddleware。

原因是,当djangoappengine.views.warmup和djangoappengine.deferred.handler.application加载INSTALLED_APPS并导致调用search.autodiscover()时,djangoappengine.main.application不会这样做。因此,如果您的GAE实例直接由请求启动,则不会注册搜索索引。因此,urls.py中的search.autodiscover()是注册这些索引所必需的。