20

Django環境が「完全にロード」された後、いくつかの非常に単純なタスクを実行する必要があります。

具体的にはSignal.disconnect()、サードパーティのライブラリによってデフォルトで設定されているDjango Signalsやconnect独自のSignalsなどを実行する必要があります。また、別のライブラリのDjangoモデルに便利な機能を追加するために、 「モンキーパッチ」を実行する必要があります。

私はDjangoアプリの__init__.pyファイルでこのようなことを行ってきました。これはモンキーパッチでは正常に機能しているようですが、Signalの切断では機能しません。問題はタイミングの1つであるように思われます。何らかの理由で、Signal.connect()私が試した後、サードパーティライブラリは常にそれを呼び出してSignal.disconnect()いるようです。

したがって、2つの質問:

INSTALLED_APPSアプリの__init__.pyモジュールが読み込まれる順序に基づく保証はありますか?

Djangoアプリが完全にメモリにロードされたに実行する必要があるロジックを配置する適切な場所はありますか?

4

4 に答える 4

13

Django 1.7では、アプリはready()メソッドを実装できます:https ://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready

于 2014-01-27T13:01:57.403 に答える
7

私の質問は、この質問のより不適切な言い回しの複製です:Djangoスタートアップコードをどこに置くか。答えはその質問から来ています:

initでこれを行うミドルウェアを作成し、その後django.core.exceptions.MiddlewareNotUsedをinitから起動すると、djangoはすべてのリクエストでそれを削除します...

独自のミドルウェアの作成については、Djangoのドキュメントを参照してください。

于 2011-03-28T20:39:39.037 に答える
5

私は次のモンキーパッチをしなければなりませんでした。githubブランチのdjango1.5を使用しています。それが適切な方法かどうかはわかりませんが、私にとってはうまくいきます。

manage.pyスクリプトにも影響を与えたかったので、ミドルウェアを使用できませんでした。

とにかく、これはかなり単純なパッチです:

import django
from django.db.models.loading import AppCache

django_apps_loaded = django.dispatch.Signal()

def populate_with_signal(cls):
    ret = cls._populate_orig()
    if cls.app_cache_ready():
        if not hasattr(cls, '__signal_sent'):
            cls.__signal_sent = True
            django_apps_loaded.send(sender=None)
    return ret

if not hasattr(AppCache, '_populate_orig'):
    AppCache._populate_orig = AppCache._populate
    AppCache._populate = populate_with_signal

次に、この信号を他の信号と同じように使用できます。

def django_apps_loaded_receiver(sender, *args, **kwargs):
    # put your code here.
django_apps_loaded.connect(django_apps_loaded_receiver)
于 2013-01-22T10:41:55.587 に答える
3

私の知る限り、「完全にロードされた」というものはありません。たくさんのDjango関数が関数に含まimport somethingれています。これらのインポートは、実際にその関数を呼び出した場合にのみ発生します。必要なことを行う唯一の方法は、パッチを適用したいもの(どこでも実行できるはずです)を明示的にインポートしてから、それらにパッチを適用することです。その後、他のインポートはそれらを再利用します。

于 2011-03-26T01:03:45.837 に答える