Lan*_*ney 15 python django signals django-models
我将一个方法附加到我的Django模型的post_save信号.这样,无论何时修改模型,我都可以清除一些缓存的项目.
我遇到的问题是在保存模型时信号被触发两次.它不一定会伤害任何东西(代码只会优雅地错误)但它不可能是正确的.
一个简单的例子,只需将模型打印到控制台(使用开发服务器):
from blog.models import Post
from django.db.models import signals
def purge_cache(sender, **kwargs):
print 'Purging %s' % sender
signals.post_save.connect(purge_cache, sender=Post)
Run Code Online (Sandbox Code Playgroud)
这是使用Django的稳定1.1.1版本.
更新信息:
根据每个人的评论反馈,我修改了我的问题,因为现在问题是发现为什么post_save被触发两次.我现在的猜测是我的models.py代码被导入两次,并且post_save多次连接.
什么是最好的方法来弄清楚为什么它被导入/跑两次?
Lan*_*ney 12
显然,Python对导入模块的方式很敏感.就我而言,我的博客应用程序中的任何导入代码都不是问题,而是INSTALLED_APPS配置的问题,我假设Django使用它进行初始导入.
在我的博客应用程序中,我使用的是以下导入:
from blog.models import *
Run Code Online (Sandbox Code Playgroud)
我的settings.py配置为:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
...snip...
'sorl.thumbnail',
'mysite.blog',
)
Run Code Online (Sandbox Code Playgroud)
添加了"mysite"前缀,因为我在部署站点时最初遇到了导入路径问题.后来我通过在我的WSGI脚本中添加多个路径来解决这个问题(因此它的行为与开发服务器相同).
从settings.py中删除"mysite"前缀修复了问题:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
...snip...
'sorl.thumbnail',
'blog',
)
Run Code Online (Sandbox Code Playgroud)
在查找此问题的根源时,您可以使用快速解决方法来防止两次注册信号:
signals.post_save.connect(my_handler, MyModel, dispatch_uid="path.to.this.module")
Run Code Online (Sandbox Code Playgroud)
来源.
| 归档时间: |
|
| 查看次数: |
5630 次 |
| 最近记录: |