四、示例
以下是一些常见的使用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函数中记录请求时间,如请求路径、请求时间等。