如何使用 Django 的 auth.contrib 模块按用户名查找用户?

Posted

技术标签:

【中文标题】如何使用 Django 的 auth.contrib 模块按用户名查找用户?【英文标题】:How do I lookup a user by username using Django's auth.contrib module? 【发布时间】:2021-11-29 17:17:13 【问题描述】:

我将 Django 3.2 与 Django Rest Framework 3.12.2 和 django.contrib.auth 一起使用。我已经像这样在命令行上创建了几个超级用户

python manage.py createsuperuser --username=joe --email=joe@example.com

这会在迁移自动生成的“auth_user”表中创建条目。我很好奇如何在使用 django.contrib.auth 方法调用进行身份验证后查找用户。我有这个序列化程序,用于登录用户并发出 JWT

class UserLoginSerializer(serializers.Serializer):

    username = serializers.CharField(max_length=255)
    password = serializers.CharField(max_length=128, write_only=True)
    token = serializers.CharField(max_length=255, read_only=True)

    def validate(self, data):
        username = data.get("username", None)
        password = data.get("password", None)
        user = authenticate(username=username, password=password)
        if user is None:
            raise serializers.ValidationError(
                'A user with this email and password is not found.'
            )
        try:
            payload = JWT_PAYLOAD_HANDLER(user)
            jwt_token = JWT_ENCODE_HANDLER(payload)
            update_last_login(None, user)
        except User.DoesNotExist:
            raise serializers.ValidationError(
                'User with given email and password does not exists'
            )
        return 
            'username':user.username,
            'token': jwt_token
        

我想要一个端点,我可以在其中从 auth_user 表中查找有关用户的信息。

class UserProfileView(RetrieveAPIView):

    permission_classes = (IsAuthenticated,)
    authentication_class = JSONWebTokenAuthentication

    def get(self, request):
        try:
            token = get_authorization_header(request).decode('utf-8')
            if token is None or token == "null" or token.strip() == "":
                raise exceptions.AuthenticationFailed('Authorization Header or Token is missing on Request Headers')
            decoded = jwt.decode(token, settings.SECRET_KEY)
            username = decoded['username']
                # how to lookup the user at this point?
            status_code = status.HTTP_200_OK
            response = 
                'success': 'true',
                'status code': status_code,
                'message': 'User profile fetched successfully',
                'data': 
                        #...
                    
                

检索用户名后,使用 auth.contrib 模块在数据库中查找用户的正确方法是什么?

【问题讨论】:

您可以从请求对象访问用户 - 请参阅 here 和 docs 【参考方案1】:

您可以使用下面的代码行获取用户实例

from django.contrib.auth.models import User

User.objects.get(username=username_from_request)

如果您有自定义用户模型或带有用户名字段的配置文件模型,请使用该模型代替 User

【讨论】:

以上是关于如何使用 Django 的 auth.contrib 模块按用户名查找用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 编写代码 [关闭]

django-1-新手如何使用django

如何使用WSGI部署Django

Django:当我使用 django 表单时,如何实现这个 html 表单

[Django] 如何在Django中使用前端工具链

如何检查 Django 版本