xpa*_*nta 2 django django-signals
有时django中的信号会被触发两次.在文档中,它说创建(唯一)的好方法dispatch_uid是模块的路径或名称[1]或任何可散列对象的id [2].
今天我试过这个:
import time
my_signal.connect(my_function, dispatch_uid=str(time.time()))
Run Code Online (Sandbox Code Playgroud)
但是我担心在多用户环境中(例如在网站的情况下).这可能会被打破.在多用户环境中创建此类ID的有效且安全的方法是什么?
[1] https://code.djangoproject.com/wiki/Signals
[2] https://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals
Ala*_*air 11
将时间用作调度ID将不起作用.问题不在于您的环境是否是多用户.是连接信号的代码是否被多次导入.
假设您的模块导入了两次,相隔5秒.您已经有效地完成了以下操作.
my_signal.connect(my_function, dispatch_uid=1332407342.51)
my_signal.connect(my_function, dispatch_uid=1332407352.51)
Run Code Online (Sandbox Code Playgroud)
您的信号已使用不同的调度ID连接两次.Django 1.3及更早版本的默认项目结构允许进行双重导入,因为模块通常可以作为project.my_app.module和导入my_app.module.
如果您选择像my_app.models.function_nameDmitry建议的惯例,那么第二次导入模块时,信号将不会连接两次,因为调度ID没有更改.您可以不重复使用相同的调度ID来使用相同的信号注册不同的回调函数.