django Rest Frameworkwok 中的令牌身份验证不适用于 digitalocean,但它在我的本地运行良好

问题描述 投票:0回答:1

我已经在 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 时

django rest deployment frameworks
1个回答
0
投票

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):
    ...

再次参阅文档

© www.soinside.com 2019 - 2024. All rights reserved.