Django 未认证API出现AnonymousUser对象无属性报错如何解决?
问题根因
你移除API认证逻辑后,未携带认证信息的请求到达后端时,Django会将request.user赋值为内置的AnonymousUser实例,该实例不存在你在自定义用户模型中封装的is_liking_deal方法,因此触发属性错误。
解决方案
根据你的需求,这里提供两种可选实现:
方案1:匿名用户访问时already_liked固定返回False
直接修改序列化器的get_already_liked方法,增加用户认证状态判断即可:
def get_already_liked(self, obj): usr = self.context["request"].user if usr.is_authenticated: return usr.is_liking_deal(deal_obj=obj) # 匿名用户统一返回未点赞状态 return False
方案2:匿名用户访问时不返回already_liked字段(更贴合需求)
如果希望未登录用户完全看不到点赞相关字段,只返回优惠基础信息,可以额外重写序列化器的to_representation方法动态移除字段:
def get_already_liked(self, obj): usr = self.context["request"].user return usr.is_liking_deal(deal_obj=obj) def to_representation(self, instance): data = super().to_representation(instance) usr = self.context["request"].user # 匿名用户移除点赞状态字段 if not usr.is_authenticated: data.pop("already_liked", None) return data
内容的提问来源于stack exchange,提问作者Zeed Tanue
相关产品推荐
相关产品推荐

