django:post_syncdb信号的顺序

时间:2012-08-09 14:27:32

标签: python django

我按照说明在app/management/__init__.py内创建了post_syncdb信号:

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调试器,似乎在那个特定时间没有权限,甚至标准的是为我的模型在同一个应用程序中创建的。

有人可以提供建议吗?

-----------------------的更新 ---------------- -----------

在Chris的评论之后,我查看了调度程序类并将调试消息插入到相关文件中以了解更多信息。

基本上,在我的应用中(INSTALLED_APPS中的列表比contenttypeauth更低),其post_syncdb处理程序首先被添加到信号中。事实证明,因为在安装过程中,Django会在应用程序的管理/命令文件夹中查找要安装的自定义命令,管理/ init .py中的信号处理程序已执行。

然后我尝试将post_syncdb.connect放入models.py。运行跟踪显示使用haystack也可能遇到类似的问题

  

(,   '/Users/foo/.virtualenvs/property/lib/python2.6/site-packages/django/utils/importlib.py',   35,'import_module',['导入(名称)\ 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',['导入(名称)\ n'],0),(,'/ /

  ERS /富/ .virtualenvs /属性/ LIB / python2.6的/站点包/干草堆/的初始化的.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',['导入(名称)\ n'],0),

希望这对那些处理程序依赖于顺序并遇到类似情况的人来说非常有用

1 个答案:

答案 0 :(得分:2)

有两点需要注意。首先,在每个应用程序同步后发送post_syncdb信号,因此每个应用程序都会发送一次,而不是仅在最后一次。其次,当处理程序应用时,似乎存在固有且稳定的顺序,但它不可控制。

详细说明第二点,我花了大约30分钟时间只是盯着auth的权限post_syncdb处理程序,我看不到任何确实可以确保它的东西来自contenttypes的相同处理程序。然而,尽管如此,它自由地使用ContentType,确信一切都准备好了。我唯一的结论是,INSTALLED_APPS中的应用程序的顺序很重要,并且看起来列表中稍后的应用程序会在应用程序中的应用程序之前处理它们的处理程序。我唯一的结论是auth从字母A开始受益,而且很少有人会将其移到列表中的contenttypes下面。

这也意味着您的应用在contenttypesINSTALLED_APPS之后不可避免地定义,其信号处理程序在contenttypes 之前运行,并且这是你的问题。这不是一场竞争条件,而是始终领先于contenttypes

我想,您可以在INSTALLED_APPS中移动您的应用,但这可能会导致其他无法预料的问题。您也可以尝试将sender属性更改为其他模型文件,甚至可能是contenttypes,也许这可能会给它足够的时间来弹出。