python - django:post_syncdb 信号的顺序

标签 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 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/

相关文章:

python - 等价于 NumPy 中的命名元组?

python - Django 保存点回滚捕获完整性错误导致 TransactionManagementError

python - 如何在列表中循环更多次 python 中的列表大小?

python - 使用 django 进行 Selenium 测试给出 'NoneType' 对象没有属性 'path'

python - Django crispy-forms wrap all 不工作

python - Django BigInteger自动增量字段作为主键?

django - Django 和 React 托管在同一服务器上的 CORS 问题

python 应用程序 - xcb 插件失败

python - ffmpeg xstack 过滤器布局限制

python - '#!/usr/bin/python' 在每个 Python 脚本前面是必须的吗?