2014-01-20 43 views
0

當GAE發送暖機請求時,djangoappengine.views.warmup完成加載所有Django應用程序的工作。如果GAE沒有發送預熱請求,無論是由於請求高峯還是因爲預熱服務未啓用,那麼INSTALLED_APPS何時會被導入?我看到djangoappengine.deferred.handler.application加載了所有INSTALLED_APPS,但是djangoappengine.main.application沒有加載。如果沒有預熱請求,INSTALLED_APPS何時在GAE上導入?

我遇到的問題是,如果沒有預熱請求,那麼無論是第一個加載請求處理程序還是後續請求處理程序都可能需要非註冊搜索模型字段,因爲搜索沒有通過導入INSTALLED_APPS因此autodiscover()尚未運行。

我的設置MIDDLEWARE_CLASSES確實有'autoload.middleware.AutoloadMiddleware',所以我認爲它可以在沒有熱身的情況下加載,但事實並非如此。

在處理任何請求之前,確保一切都已加載的解決方案是什麼?

+0

我注意到,除了使用autoload應用程序及其中間件公開多個入口點來加載搜索索引外,官方testapp還顯式調用了urls.py中的自動發現,如下所示:https://github.com /django-nonrel/django-testapp/blob/0c1245b381ab6a27c8ec3ff68f16ed84969b539f/urls.py 我想這就是這個問題的處理方式,雖然我不確定爲什麼這些不同的切入點沒有以更一致的方式統一。也許有人可以解釋? – jacob

回答

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()是註冊這些索引所必需的。

相關問題