调试Django信号处理器
我第一次尝试使用信号。 我有一个模型,叫做 UserAlias
,我想在创建 UserAlias
记录后执行一些代码。
UserAlias
定义在 aliases/models.py
文件中。我创建了一个 aliases/signals/handlers.py
文件。这个文件的内容如下:
from django.db.models.signals import post_save, post_init, post_delete
from django.dispatch import receiver
from aliases.models import UserAlias
@receiver(post_init, sender=UserAlias)
def post_init_handler(sender, **kwargs):
print('hello there from a signal')
@receiver(post_save, sender=UserAlias)
def post_save_handler(sender, **kwargs):
print('hello there from a signal')
@receiver(post_delete, sender=UserAlias)
def post_delete_handler(sender, **kwargs):
print('hello there from a signal')
但是当我执行:
from aliases.models import *
newalias = UserAlias.objects.create(...omitted...)
我没有看到我的调试 print
语句被执行。 我这里缺少了什么呢?
更新:
我把我的 post_init_handler
、post_save_handler
和 post_delete_handler
的定义移动到了 aliases/models.py
文件中,放在 UserAlias
类的声明之后。
另外,我的 post_init_handler
现在看起来是这样的:
@receiver(post_init, sender=UserAlias)
def post_init_handler(sender, instance, **kwargs):
print(f'hello there from a signal {sender} {instance}')
我尝试按照 Paaksing 的建议声明它……
@receiver(post_init, sender=UserAlias)
def post_init_handler(sender, instance, created, **kwargs):
print(f'hello there from a signal {created} {sender} {instance}')
但是我得到了这个错误:
TypeError: post_init_handler() missing 1 required positional argument: 'created'
更新 II:
post_init 处理器没有 created
参数。 created
参数是和 post_save
处理器一起用的。像这样:
@receiver(post_save, sender=UserAlias)
def post_save_handler(sender, instance, created, **kwargs):
if created:
print(f'hello from post_save_handler( {sender}, {instance}, {created})')
相关问题:
- 暂无相关问题
2 个回答
0
你在一个单独的模块里创建了信号(这很好)。不过,你还需要在正确的位置导入这个模块,才能使用这些信号。
Django的文档建议把信号放在你的应用配置文件里。你可以像这样做。
from django.apps import AppConfig
class MyAppConfig(AppConfig):
name = 'myproject.app'
def ready(self) -> None:
import myproject.app.aliases/signals/handlers # noqa
2
你漏掉了一个 created
属性。
如果你在处理像用户一样的模型,建议添加 instance
,这样你就可以在信号中对它们进行操作。
@receiver(post_save, sender=UserAlias)
def post_save_handler(sender, instance, created, **kwargs):
if created:
print('hello there from a signal')
更新:正如 Red Cricket 所说,post_init
没有 created
实例,但在 post_save
中按预期工作。
在 Django 的文档中,你可以看到可以与每个信号一起使用的所有实例:https://docs.djangoproject.com/en/3.0/ref/signals/