2

私は指示に従い、post_syncdbシグナルを内部に作成しましたapp/management/__init__.py

from django.db.models.signals import post_syncdb
from django.contrib.auth.models import Group, Permission
import payment.models as payModels


def initialization(sender, **kwargs):
    """ initialization when appliation starts """
    agents = Group.objects.get(name = "agents")
    import pdb
    pdb.set_trace()
    if not agents.permissions.filter(codename="can_buy_package").exists():
        perm = Permission.objects.get(codename="can_buy_package")
        agents.permissions.add(perm)

post_syncdb.connect(initialization, sender= payModels)

シグナルは実行されますが、そこでpythonデバッガーを使用すると、その特定の時点ではアクセス許可がないようです。同じアプリ内のモデル用に標準のアクセス許可も作成されています。

誰かがアドバイスできますか?

-----------------------更新-------------------------- -

クリスのコメントの後、私はディスパッチャークラスを見て、詳細を理解するために関連ファイルにデバッグメッセージを挿入しました。

基本的に、私のアプリ(およびよりもリストのさらに下にありますINSTALLED_APPS)では、そのハンドラーが最初にシグナルに追加されました。セットアップ中に、Djangoがアプリのmanagement / commandsフォルダー内にインストールするカスタムコマンドを探し、management /init.py内のシグナルハンドラーが実行されたことが判明しましcontenttypeauthpost_syncdb

post_syncdb.connectそれから私は私の中に入れようとしましたmodels.py。トレースを実行すると、haystackを使用しても同様の問題が発生する可能性があることがわかります

(、'/Users/foo/.virtualenvs/property/lib/python2.6/site-packages/django/utils/importlib.py'、35、'import_module'、[' import(name)\ n']、0 )、(、'/Users/foo/.virtualenvs/property/lib/python2.6/site-packages/haystack/ init .py'、121、'autodiscove r'、['
importlib.import_module( "%s.search_indexes "%app)\ n']、0)、(、' /Users/foo/Documents/workspace/prop
erty_buyer / haystack_sites.py'、2、''、[' haystack.autodiscover()\ n']、0 )、(、'/Users/foo/.virtualenvs /prop
erty / lib / python2.6 / site-packages / django / utils / importlib.py'、35、'import_module'、[' import(name)\ n' ]、0)、(、'/ Us
ers /foo/。virtualenvs / property / lib / python2.6 / site-packages / haystack / init.py'、151、' handle_registrations'、[' search_sites_conf = importlib
.import_module(settings.HAYSTACK_SITECONF)\ n']、0)、(、' /Users/foo/.virtualenvs/property/lib/python2.6/site -packa
ges / haystack / init .py'、154、''、[' handle_registrations()\ n']、0)、(、' /Users/foo/.virtualenvs/propert
y / lib / python2.6 / site -packages / django / utils / importlib.py'、35、' import_module'、[' import(name)\ n']、0)、

これが、ハンドラーが順序に依存し、同様のケースに遭遇する人々に役立つことを願っています

4

1 に答える 1

2

注意すべきことが2つあります。まず、post_syncdb信号は各アプリが同期された後に送信されるため、最後に1回だけでなく、アプリごとに1回送信されます。第二に、ハンドラーが適用される固有の安定した順序があるように見えますが、それは制御できません。

2番目のポイントを詳しく説明するために、私は30分の大部分を、authのアクセス許可post_syncdbハンドラーを見つめているだけで過ごしましたが、の同じハンドラーの後に続くことを実際に保証するものは何もありませんcontenttypes。それにもかかわらず、それはContentType自由に使用し、すべてが準備ができていることを確信しています。私の唯一の結論は、INSTALLED_APPS重要なアプリの順序であり、リストの後半にあるアプリでは、リストのより早いアプリの前にハンドラーが処理されるように見えます。私の唯一の結論はauth、文字で始めることの利点であり、結果としてリストのA下にそれを移動する人はほとんどいないということです。contenttypes

これは、inの後contenttypesに必然的に定義されるアプリのシグナルハンドラーが、のシグナルハンドラーの前に実行INSTALLED_APPSされることを意味し、問題があります。常に先行しているため、競合状態ではありません。contenttypescontenttypes

アプリを上に移動することもできますが、INSTALLED_APPSそれによって他の予期しない問題が発生する可能性があります。senderまた、属性を別のモデルファイルに変更してみることもできます。おそらくcontenttypes、それによって、ポップするのに十分な時間が与えられる可能性があります。

于 2012-08-09T15:33:26.280 に答える