簡體   English   中英

HTTP 響應不包含“Content-Type”標頭

[英]HTTP Response does not contain a 'Content-Type' header

我正在測試一個APIView ,它檢查用戶是否對帖子進行了投票。 發送回客戶端的響應應該具有Content-Type: application/json的標頭。 然而,運行測試時出現以下錯誤:

    self.assertIn("Content-Type", response.headers)
AssertionError: 'Content-Type' not found in {'Allow': 'POST, OPTIONS', 'X-Frame-Options': 'DENY', 
'Content-Length': '0', 'Vary': 'Cookie', 'X-Content-Type-Options': 'nosniff', 'Referrer-Policy': 'same-origin'}

為什么JSONRenderer上直接聲明JSONRenderer,響應中沒有Content-Type header?

class APIStateTestCase(APITestCase):

    @classmethod
    def setUpTestData(cls):
        user = get_user_model().objects.create_user(
            username="MainUser", password="mypassword"
        )
        profile = Profile.objects.create(user=user)
        tag = Tag.objects.create(name="Tag1")
        question = Question.objects.create(
            title="Test Dummy Question",
            body="This is post content about question 'Test Dummy Question'",
            profile=profile
        )
        question.tags.add(tag)

class TestNewPostVote(APIStateTestCase):

    @classmethod
    def setUpTestData(cls):
        super().setUpTestData()
        cls.client = LoggedInAPIClient(
            HTTP_ACCEPT="application/json"
        )


    def test_user_previous_vote_updated(self):
        self.client.login(username="MainUser", password="mypassword")
        response = self.client.post(
            reverse("api_posts:posts", kwargs={"id": 1}),
            data={'type': "up", 'post': 'question'}
        )
        self.assertEqual(response.status_code, 201)
        self.assertIn("Content-Type", response.headers)
        self.assertEqual(
            response.headers['Content-Type'],
            "application/json"
        )

端點.py


from rest_framework.views import APIView
from rest_framework.status import HTTP_201_CREATED, HTTP_200_OK, HTTP_204_NO_CONTENT
from rest_framework.response import Response
from rest_framework.parsers import JSONParser
from rest_framework.renderers import JSONRenderer

from .models import Question, Answer, Vote
from .serializers import VoteSerializer

class UserVoteEndpoint(APIView):

    parser_classes = [JSONParser, ]
    renderer_classes = [JSONRenderer, ]

    def post(self, request, id):
        models = {
            'question': Question,
            'answer': Answer
        }
        model_content_type = ContentType.objects.get_for_model(
            models[request.data.pop('post')]
        )
        post = model_content_type.get_object_for_this_type(id=id)
        try:
            post.vote.get(profile=request.user.profile)
        except Vote.DoesNotExist:
            Vote.objects.create(
                profile=request.user.profile,
                type=request.data['type'],
                content_object=post
            )
            return Response(status=HTTP_201_CREATED)
        else:
            serializer = VoteSerializer(
                instance=post, data=request.data, context={'request': request}
            )
            if serializer.is_valid(raise_exception=True):
                serializer.save(profile=request.user.profile)
                return Response(status=HTTP_200_CREATED)

序列化程序.py

class VoteSerializer(ModelSerializer):
    def validate_type(self, value):
        user_vote = self.instance.vote.get(
            profile=self.context['request'].user.profile
        )
        if user_vote.type == value:
            raise ValidationError
        return value


    class Meta:
        model = Vote
        fields = ['type']

您可以在 post 方法中傳遞content_type

def test_user_previous_vote_updated(self):
    self.client.login(username="MainUser", password="mypassword")
    response = self.client.post(
        reverse("api_posts:posts", kwargs={"id": 1}),
        data={'type': "up", 'post': 'question'},
        content_type='application/json'           
    )
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM