You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:18:01