您遇到的问题是因为在使用 @api_view
装饰器时,Django REST Framework (DRF) 会自动将原始的 HttpRequest
对象包装成 rest_framework.request.Request
对象。因此,当您的视图函数直接接收这个参数并尝试将其作为 django.http.HttpRequest
使用时,就会触发类型断言错误。
解决这个问题非常简单,您不需要做任何特殊处理来转换请求对象,因为 rest_framework.request.Request
是 django.http.HttpRequest
的子类,并且它扩展了额外的功能,如访问请求体中的数据(对于POST/PUT等)。所以,您当前的代码实际上应该可以正常工作,除了一个小问题:您需要从 rest_framework.response
导入 Response
类,并且在异常处理部分正确地返回一个 Response
对象。
以下是修正后的代码示例:
from rest_framework.decorators import api_view
from rest_framework.response import Response
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
@api_view(["POST"])
def api_get_token(request):
data = request.data
username = data.get("username")
password = data.get("password")
try:
user: User = User.objects.get(username=username)
except User.DoesNotExist:
return Response({
"code": -1,
"msg": "登录失败,用户不存在",
"token": ""
})
if not user.check_password(password):
return Response({
"code": -2,
"msg": "登录失败,密码错误",
"token": ""
})
token, is_created = Token.objects.get_or_create(user=user)
return Response({
"code": 0,
"msg": "登录成功",
"token": token.key
})
确保您已经导入了 Response
类,并且在捕获异常时具体指定了 User.DoesNotExist
异常。这样,当查询不到用户时,能够准确地捕获到该异常并返回适当的响应。此外,在检查密码之前,我添加了一个条件判断,以确保只有在密码不匹配的情况下才返回密码错误的信息。