我已经在 digitalocean 中部署了一个 django 休息框架,当使用 postman 软件发出 post 和 get 请求时,一切都工作正常,但是当向下面的 TestView 发出 post 请求时,它显示此错误:“Field 'id'期待一个数字,但得到了
在这一行中:score = Score.objects.get(user=request.user.id)。
这是测试视图:
测试视图类(APIView): 身份验证类 = [TokenAuthentication] def get(自身, 请求): 问题 = Question.objects.all() questions_serializer = QuestionsSerializer(问题,many=True,context={'request': request}) 返回响应(questions_serializer.data)
def post(self, request):
question_id = request.data.get('id')
user_answer = request.data.get('answers')
correct_answer = Answer.objects.filter(question=question_id, is_correct=True).values_list('answer', flat=True).first()
if correct_answer is not None:
if user_answer == correct_answer:
try:
score = Score.objects.get(user=request.user.id)
print(self.user)
score.score += 1
score.save()
except Score.DoesNotExist:
score = Score.objects.create(user=request.user, score=1)
score_serializer = ScoreSerializer(score)
return Response({'message': 'your answer was correct', 'score': score_serializer.data}, status=status.HTTP_200_OK)
else:
return Response({'message': 'your answer was incorrect'}, status=status.HTTP_400_BAD_REQUEST)
else:
return Response({'message': 'correct answer not found for this question'}, status=status.HTTP_404_NOT_FOUND)
如果在这行代码中对用户 ID 进行硬编码,如下所示:
而不是这个: 分数 = Score.objects.get(user=request.user.id) 改为: 分数 = Score.objects.get(user=1)
然后就可以了。
我还打印了 print(request.user)、print(request.user.id) 和 print(request.auth) 它们为空,但在我的本地 print(request.user) 正在打印用户。我还联系了他们转发给我的 digitalocean 支持人员。任何人都可以帮忙,请向前迈出一步。我已经为这个错误苦苦挣扎了两个多星期。
我想从标头中传递的令牌中获取用户,但是当我 print(request.user.id) 显示 null 时
DRF 令牌身份验证工作所需的主要内容是对项目进行一些添加
settings.py
# settings.py
INSTALLED_APPS = [
...
'rest_framework.authtoken'
]
...
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
...
'rest_framework.authentication.TokenAuthentication',
]
}
请参阅文档了解更多信息。
要阻止您的视图处理匿名请求,您可以执行以下操作:
# views.py
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
# import models, serialisers etc.
# ...
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def post(self, request):
...
再次参阅文档。