django信号。如何创建一个独特的调度ID?

时间:2012-03-21 21:28:19

标签: django django-signals

有时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

2 个答案:

答案 0 :(得分:11)

将时间用作发送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来使用相同的信号注册不同的回调函数。

答案 1 :(得分:7)

只需在模块中使用字符串,例如'apps.models.signal_name'