Django REST Framework-信号示例

2023-04-26 00:03:25 浏览数 (1)

四、示例

以下是一些常见的使用DRF信号的示例:

在用户登录后执行某些操作:

代码语言:javascript复制
from django.dispatch import receiver
from rest_framework import signals
from django.contrib.auth.signals import user_logged_in

@receiver(user_logged_in)
def do_something(sender, user, request, **kwargs):
    # Execute custom code here
    pass

上面的代码定义了一个名为do_something的函数,并将其注册为user_logged_in信号处理器。当用户成功登录时,do_something函数将被调用。我们可以在do_something函数中执行任何自定义的代码,如记录用户登录日志、更新用户信息等。

在对象创建后发送电子邮件:

代码语言:javascript复制
from django.dispatch import receiver
from django.core.mail import send_mail
from rest_framework import signals
from myapp.models import MyModel

@receiver(signals.post_save, sender=MyModel)
def send_email(sender, instance, created, **kwargs):
    if created:
        # Send email to user here
        send_mail(
            'New object created',
            'A new object has been created',
            'from@example.com',
            ['to@example.com'],
            fail_silently=False,
        )

上面的代码定义了一个名为send_email的函数,并将其注册为MyModel对象的post_save信号处理器。当MyModel对象被保存时,send_email函数将被调用。如果对象是新创建的,则send_email函数将发送电子邮件通知用户。

在请求结束后记录请求时间:

代码语言:javascript复制
from django.dispatch import receiver
from rest_framework import signals
import time

@receiver(signals.request_finished)
def log_request(sender, **kwargs):
    # Log request time here
    request = kwargs['request']
    response = kwargs['response']
    duration = time.time() - request._start_time
    print(f"Request to {request.path} took {duration:.2f} seconds")

上面的代码定义了一个名为log_request的函数,并将其注册为request_finished信号处理器。当请求处理完毕后,log_request函数将被调用。我们可以在log_request函数中记录请求时间,如请求路径、请求时间等。

0 人点赞