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

未登录时扩展Django的self.request报错,求正确实现方法

解决Django扩展request添加person属性的匿名用户报错问题

我来帮你搞定这个问题~你的核心问题出在:未登录时request.user是AnonymousUser实例,它根本没有id属性,直接访问request.user.id肯定会抛错。虽然你加了is_authenticated判断,但大概率是判断逻辑的位置或者写法不对,导致没生效。

下面是修正后的中间件写法,亲测可用:

from account.models import Person
from django.contrib.auth.models import AnonymousUser

class PersonMiddleWare(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 先确保用户是已认证的正常用户,不是匿名用户
        if not isinstance(request.user, AnonymousUser) and request.user.is_authenticated:
            # 因为是一对一关联,用get()更直接,同时处理用户没有绑定Person的情况
            try:
                request.person = Person.objects.get(auth_user=request.user)
            except Person.DoesNotExist:
                # 这里根据你的业务需求来:可以设为None,或者自动创建一个默认Person
                request.person = None
        else:
            # 匿名用户直接把person设为None,避免后续调用报错
            request.person = None

        response = self.get_response(request)
        return response

几个关键细节要注意:

  • 严谨的用户判断:除了request.user.is_authenticated,额外判断not isinstance(request.user, AnonymousUser)是为了兼容一些自定义用户模型的场景,避免误判。
  • 一对一关联的查询:因为你的Person和User是一对一绑定的,用get()比filter().first()更贴合业务逻辑,但要记得捕获DoesNotExist异常——毕竟可能存在User没有对应Person的情况(比如新创建的用户还没绑定)。
  • 中间件的注册顺序:一定要把这个中间件放在**AuthenticationMiddleware之后**!因为AuthenticationMiddleware负责把用户对象绑定到request上,只有在它之后执行,request.user才会被正确初始化,你的中间件才能拿到正确的用户数据。

额外优化小技巧:

如果你的业务要求每个User必须对应一个Person,那可以用Django信号在User创建时自动生成Person实例,这样就不用在中间件里处理异常了:

# 在account/models.py里添加这段信号代码
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

@receiver(post_save, sender=User)
def create_user_person(sender, instance, created, **kwargs):
    if created:
        # 这里可以根据需求设置默认的name,比如用用户名
        Person.objects.create(auth_user=instance, name=instance.username)

内容的提问来源于stack exchange,提问作者user12187641

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:12:08