如何在Django的signals.py文件中获取当前登录用户?
问题修复方案
错误原因
signals.py顶层直接调用request.user.email属于逻辑错误:request对象仅存在于 Django 视图的请求生命周期内,不是全局变量,信号模块加载时不存在该对象,直接触发 NameError。- 触发自定义信号时没有传递业务参数,信号接收方无法获取用户、逾期任务等必要信息。
- 原有代码还存在其他语法/参数错误:
send_mail收件人要求为列表格式,代码末尾存在多余的无效引号。
修复步骤
1. 修改视图层,触发信号时传递必要参数
先过滤当前登录用户的专属逾期任务,再将用户、逾期任务作为参数传入信号:
# views.py 修正后代码 from .models import Todo from django.utils import timezone from .signals import overdue def index(request): ... # 新增user过滤条件,只查当前登录用户的逾期任务,避免拿到全平台所有逾期任务 overdue_tasks = Todo.objects.filter(time__lte=timezone.now(), user=request.user) if overdue_tasks: # 传递当前用户、逾期任务列表作为信号参数 overdue.send_robust(sender=Todo, user=request.user, overdue_tasks=overdue_tasks) ... return render(request, 'todo/index.html', {'overdue_tasks' : overdue_tasks })
2. 修改signals.py,从信号参数获取用户信息
删除顶层无效的request调用,从信号的kwargs参数中提取业务数据:
# signals.py 修正后代码 from django.dispatch import receiver, Signal from django.core.mail import send_mail overdue = Signal() @receiver(overdue) def my_handler(sender, **kwargs): # 从信号参数中取出用户和逾期任务 user = kwargs.get('user') overdue_tasks = kwargs.get('overdue_tasks') # 异常判断避免空值报错 if not user or not user.email: return send_mail( subject='任务逾期提醒', message=f'你有{len(overdue_tasks)}个任务已逾期,请及时处理!', from_email='myemail@gmail.com', # 收件人必须为列表格式 recipient_list=[user.email], fail_silently=False )
内容的提问来源于stack exchange,提问作者Abdullah Atif
相关产品推荐
相关产品推荐

