跳到内容

django-non-leading-receiver-decorator (DJ013)

源自 flake8-django linter。

作用

检查 Django 的 @receiver 装饰器是否列在第一位,在任何其他装饰器之前。

为什么这不好?

Django 的 @receiver 装饰器很特殊,因为它不返回包装函数。 而是,@receiver 将被装饰的函数连接到信号。 如果在 @receiver 之前列出任何其他装饰器,则被装饰的函数将不会连接到信号。

示例

from django.dispatch import receiver
from django.db.models.signals import post_save


@transaction.atomic
@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
    pass

建议改为

from django.dispatch import receiver
from django.db.models.signals import post_save


@receiver(post_save, sender=MyModel)
@transaction.atomic
def my_handler(sender, instance, created, **kwargs):
    pass