为社交媒体应用扩展 self.request 的 Django 中间件
Django Middleware to Extend self.request for a social media apps
我们知道在 Django 中,我们可以在 self.request
中访问太多实例,例如 self.request.user
、self.request.data
、self.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 是否为空?并且只检查下一位是否不为空。
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
我们知道在 Django 中,我们可以在 self.request
中访问太多实例,例如 self.request.user
、self.request.data
、self.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 是否为空?并且只检查下一位是否不为空。
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