2

GoogleAppEngineアプリケーションをDjango0.96から1.2に移行しています。その過程で、メインハンドラーで指定した設定ファイルがロードされなくなったことに気付きました(指定された3つの言語の代わりに、Djangoはそのdjango/conf/global_settings.pyファイルからデフォルト言語の完全なリストをロードしました)。

0.96では、次のようにファイルを指定しました。

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'conf.settings'

私がドキュメントで読んだことから、これは変更されるべきではありません。ただし、次のようにバージョン1.2を指定する場合:

from google.appengine.dist import use_library
use_library('django', '1.2')

conf.settingsもうインポートされていません。GAEのSDKを少し掘り下げてみると、0.96バージョンと1.2バージョンのgoogle_appengine/lib/django_<VERS>/django/conf/__init__.pyファイルの動作が異なることに気づきました。

0.96では、LazySettings._import_settingsから呼び出されLazySettings.__getattr__、で指定されたファイルos.environ['DJANGO_SETTINGS_MODULE']がインポートされます。

1.2では、LazySettings._setupどこにも呼び出されていないようです。

メインハンドラーに手動呼び出しを追加するとsettings._setup()、カスタム設定ファイルが正しくインポートされます。このような:

from django.conf import settings
settings._target = None # Force Django to reload settings
settings._setup()

ただし、そのプライベート関数を手動で呼び出さなければならないのは奇妙で間違っていると感じます...カスタム設定ファイルがインポートされなくなったのはなぜですか?

4

1 に答える 1

2

ここで何が起こっているかについての良い説明があります:

Django 設定は、最初にアクセスしたときに、指定された settings.py から遅延して読み込まれます。問題は、webapp.template をインポートすると django.conf.settings.configure() が呼び出され、いくつかの設定をセットアップしようとすることです。したがって、設定にアクセスする前に webapp.template がインポートされた場合、settings.py は読み込まれません (設定アクセサーが設定が既に存在することを検出し、それ以上読み込みを試みないため)。

これに対する解決策は、webapp.template がインポートされる前に、設定へのアクセスを強制し、settings.py をロードすることです。その後、webapp.template が後でインポートされると、django.conf.settings.configure() への呼び出しは無視されます。

私にはバグのように聞こえます。issue trackerに送信できます。

于 2011-05-01T01:45:51.843 に答える