gpt4 book ai didi

Django 信号。如何创建唯一的调度ID?

转载 作者:行者123 更新时间:2023-12-01 19:59:45 29 4
gpt4 key购买 nike

有时 django 中的信号会被触发两次。在文档中,它说创建(唯一)dispatch_uid 的一个好方法是模块的路径或名称[1] 或任何可哈希对象的 ID[2]。

今天我尝试了这个:

import time
my_signal.connect(my_function, dispatch_uid=str(time.time()))

但是,我担心在多用户环境中(例如在网站的情况下)。这可能会被打破。在多用户环境中创建此类 id 的良好且安全的方法是什么?

[1] https://code.djangoproject.com/wiki/Signals

[2] https://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals

最佳答案

使用时间作为调度 ID 不起作用。问题不在于您的环境是否是多用户。而是连接信号的代码是否被导入多次。

假设您的模块被导入两次,间隔 5 秒。您已经有效地完成了以下操作。

my_signal.connect(my_function, dispatch_uid=1332407342.51)
my_signal.connect(my_function, dispatch_uid=1332407352.51)

您的信号已使用不同的调度 ID 连接两次。 Django 1.3 及更早版本的默认项目结构允许发生这种双重导入,因为模块通常可以作为 project.my_app.modulemy_app.module 导入。

如果您按照 Dmitry 建议选择像 my_app.models.function_name 这样的约定,那么第二次导入模块时,信号将不会连接两次,因为调度 id 没有更改。您可以决定是否重复使用相同的调度 id 来使用相同的信号注册不同的回调函数。

关于Django 信号。如何创建唯一的调度ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813156/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com