【问题标题】:Django Middleware to Extend self.request for a social media appsDjango 中间件扩展社交媒体应用程序的 self.request
【发布时间】:2019-10-09 12:40:33
【问题描述】:

我们知道在 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 django-rest-framework django-middleware


    【解决方案1】:

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

    self.request.user.is_authenticated

    也抛出一个错误,因为它们没有经过身份验证,所以用户为空,所以可以尝试检查 self.request.user 是否为空?如果下一位不为空,则只检查下一位。

    来自Documentation

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

    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

    【讨论】:

    • AnonymousUser 没有属性 self.request.user 这表示当您有 AnonymousUser 时 self.request.user 不存在
    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2016-08-01
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多