为社交媒体应用扩展 self.request 的 Django 中间件

Django Middleware to Extend self.request for a social media apps

我们知道在 Django 中,我们可以在 self.request 中访问太多实例,例如 self.request.userself.request.dataself.request.authenticator

我正在尝试 self.request.mygroup 编写自定义中间件

这是我的模型

from django.contrib.auth.models import User
from django.db import models
class Person(models.Model):
    id = models.UUIDField(
        primary_key=True,
        default=uuid4,
        editable=False
    )
    auth_user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name='auth_user',
    )

class Group(models.Model):
    members = models.ManyToManyField(
        Person,
        related_name='group_members'
    )

我写了这个中间件,它工作正常:

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

    def __call__(self, request):
        person = Person.objects.filter(
            auth_user__id=request.user.id
        ).first()
        mygroup = Group.objects.filter(
            members__alias__in=[person.alias]
        )
        request.mygroup = mygroup.first()
        response = self.get_response(request)
        return response

上面的中间件工作正常,但问题是当我从隐身模式访问时,我的意思是当我没有登录时,它会抛出一个错误,比如 AnonymouseUser 没有属性 self.request.user

为了处理这个问题,我尝试编写条件,如 if self.request.user.is_authenticated: 但它发生了另一个错误。我想我错误地制作了中间件,任何人都可以帮助我扩展 self.request 以获得我自己的实例,如 self.request.mygroup?

我不知道什么是编写中间件的正确方法,我是中间件的新手

我希望self.request.mygroup 应该只重新调整经过身份验证的用户组

我不是 Django 用户,但听起来你检查错了。

self.request.user.is_authenticated

也会抛出错误,因为它们未经过身份验证,因此用户为空,所以也许可以尝试检查 self.request.user 是否为空?并且只检查下一位是否不为空。

来自 Documentation

django.contrib.auth.models.AnonymousUser 是实现 django.contrib.auth.models.User 接口的 class,但有以下区别:

id is always None.
username is always the empty string.
get_username() always returns the empty string.
is_staff and is_superuser are always False.
is_active is always False.
groups and user_permissions are always empty.
is_anonymous() returns True instead of False.
is_authenticated() returns False instead of True.
set_password(), check_password(), save() and delete() raise NotImplementedError.

可能也在这里:django profies and request.user - error