python - 为什么 django rest 框架返回无效的 JSON 响应?

标签 python django django-rest-framework

我使用 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()

我的 APIView 为:


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 输出,有这么多“\”字符?

最佳答案

原因是 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,直接将字典传递给Response
  • 删除 JSONRenderer,然后专门告诉 Response 使用 text/html 作为内容类型。

关于python - 为什么 django rest 框架返回无效的 JSON 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546832/

相关文章:

Python - 水平打印两个字符串,带有 |

django - 将 REST 和 RPC 混合在一起是不好的做法吗?

java - 未找到 JPype 类

python - 解析多个文件 argparse

python - 如何在 django Rest 框架中使用外键进行计数

Django表格内联显示

python - 当用户在 django Rest api 中发布图像时如何调用函数

python - 如何获取序列化器方法字段中的所有实例

python - 将以 .pdf 结尾的文件移动到选定的文件夹 (Python)

python - 每晚重建 Django 站点