【问题标题】:When does INSTALLED_APPS get imported on GAE if there is no warmup request?如果没有预热请求,什么时候在 GAE 上导入 INSTALLED_APPS?
【发布时间】:2014-02-09 22:05:48
【问题描述】:

djangoappengine.views.warmup 会在 GAE 发送预热请求时加载所有 Django 应用程序。如果 GAE 没有发送预热请求,无论是由于请求峰值还是因为未启用预热服务,那么何时导入 INSTALLED_APPS?我看到 djangoappengine.deferred.handler.application 加载了所有 INSTALLED_APPS,但 djangoappengine.main.application 没有。

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

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

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

【问题讨论】:

  • 我注意到官方的testapp除了使用autoload app及其中间件暴露多个入口点来加载搜索索引外,还在urls.py中显式调用了autodiscover,如下图:@987654321 @我想这就是这个问题的处理方式,虽然我不确定为什么这些不同的入口点没有以更连贯的方式统一。也许有人可以解释一下??

标签: django-nonrel djangoappengine


【解决方案1】:

解决方案是在站点的 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() 是注册这些索引所必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多