【问题标题】:Why django rest framework return invalid JSON reponse?为什么 django rest 框架返回无效的 JSON 响应?
【发布时间】:2015-09-13 06:05:33
【问题描述】:

我使用 djangorestframework 生成 API,我的 Serializer 为:


from rest_framework import serializers


class MarketSerializer(serializers.Serializer):
    total_market_cap = serializers.FloatField(read_only=True)
    volume = serializers.FloatField(required=False)
    turnover_rate = serializers.FloatField(required=False)
    pe = serializers.FloatField(required=False)


class MarketOverallSerializer(serializers.Serializer):
    # markets = MarketSerializer(many=True)  # A nested list of 'edit' items.
    sh = MarketSerializer()
    sz = MarketSerializer()
    cyb = MarketSerializer()
    zxb = MarketSerializer()

我的 API 查看为:


import json
from django.shortcuts import render

# Create your views here.
from rest_framework.renderers import JSONRenderer

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from serializers import MarketSerializer, MarketOverallSerializer
from market.models import Market
from market.parse import *


class MarketView(APIView):

    def get(self, request, *args, **kw):
        # Process any get params that you may need
        # If you don't need to process get params,
        # you can skip this part
        market = market_overall()
        serializer = MarketOverallSerializer(market)
        content = JSONRenderer().render(serializer.data)
        print '**********content:{}'.format(content)
        response = Response(content, status=status.HTTP_200_OK)

        return response

我得到 JSON 响应:


"{\"sh\":{\"total_market_cap\":262143.47,\"volume\":25240015.73,\"turnover_rate\":0.84,\"pe\":15.8},\"sz\":{\"total_market_cap\":0.0,\"volume\":0.0,\"turnover_rate\":0.0,\"pe\":0.0},\"cyb\":null,\"zxb\":null}"

为什么生成的响应不是有效的 JSON 输出,有这么多“\”字符?

【问题讨论】:

  • response = Response(json.loads(content), status=status.HTTP_200_OK),但为什么会这样?

标签: python django django-rest-framework


【解决方案1】:

原因是DRF中默认的渲染器是json(参考:http://www.django-rest-framework.org/api-guide/renderers/#setting-the-renderers)。

所以每次使用 DRF 的 Response 时都应该直接传递 dict 而不是渲染的 json。

在您的情况下,通过一次又一次地渲染 json(通过使用 Response),json 内置模块会转义特殊字符并将其视为单个字符串(这就是为什么 json.loads() 会返回正确的 json)

所以修复它的方法是:

  • 不要用JSONRenderer,直接把dict传给Response
  • 删除JSONRenderer,然后专门告诉Response 使用text/html 作为内容类型。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2020-08-07
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多