我按照说明进行操作,并在 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
中比contenttype
和auth
更靠下的位置)它的post_syncdb
code> 处理程序首先添加到信号中。事实证明,因为在安装过程中,Django 会查找要安装在应用程序的 management/commands 文件夹中的自定义命令,并执行了我的 management/init.py 中的信号处理程序。
然后我尝试将 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),
希望这对于那些处理程序依赖于顺序并遇到类似情况的人有用
最佳答案
有两点需要注意。首先,post_syncdb
信号在每个应用程序同步后发送,因此每个应用程序都会发送一次,而不是在最后发送一次。其次,处理程序的应用似乎有一个固有且稳定的顺序,但它是不可控制的。
为了详细说明第二点,我花了 30 分钟的大部分时间盯着 auth
的权限 post_syncdb
处理程序,但我看不到任何实际确保它出现在 contenttypes
的相同处理程序之后的内容。然而,尽管如此,它仍然可以自由地使用 ContentType
,并确信一切都已准备就绪。我唯一的结论是,INSTALLED_APPS
中应用程序的顺序很重要,并且列表中较晚的应用程序的处理程序会先于列表中较早的应用程序处理。我唯一的结论是 auth
受益于以字母 A
开头,因此很少有人会将其移至列表中的 contenttypes
下面.
这也意味着您的应用(不可避免地在 INSTALLED_APPS
中的 contenttypes
之后定义)的信号处理程序先于 contenttypes
,这就是你的问题。与其说这是一个竞争条件,不如说它总是领先于 contenttypes
。
我想,您可以将您的应用移至 INSTALLED_APPS
中,但这可能会导致其他不可预见的问题。您还可以尝试将 sender
属性更改为不同的模型文件,甚至可能是 contenttypes
,也许这可能会给它足够的时间来弹出。
关于python - django:post_syncdb 信号的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11885651/