有时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
答案 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.module
和my_app.module
。
如果您选择像Dmitry建议的my_app.models.function_name
这样的约定,那么第二次导入模块时,信号将不会连接两次,因为调度ID没有改变。您可以不使用相同的调度ID来使用相同的信号注册不同的回调函数。
答案 1 :(得分:7)
只需在模块中使用字符串,例如'apps.models.signal_name'