如何使用 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 模块按用户名查找用户?的主要内容,如果未能解决你的问题,请参考以下文章