Django-rest-framework:设置默认渲染器不起作用?

时间:2015-04-04 22:17:45

标签: python django django-rest-framework

我正在尝试构建一个Django-rest-framework REST API,默认输出JSON,但也有XML。

我已阅读Renderers chapter of the documentation section on default ordering,并将其放入我的设置文件中:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework_xml.renderers.XMLRenderer',
    )
}

但是,默认情况下输出XML。切换顺序没有区别。

如果我将format=json附加到网址,并且我完全删除XMLRenderer行,则会获得JSON。

如何将JSON设置为默认值?

我正在使用Django的v1.7和Django-rest-framework的v3.1.1。

更新:这里要求的是我的观点代码:

class CountyViewSet(viewsets.ModelViewSet):
    queryset = County.objects.all()
    serializer_class = CountySerializer

序列化器:

from rest_framework import serializers
class CountySerializer(serializers.ModelSerializer):
    class Meta:
        model = County
        fields = ('id', 'name', 'name_slug', 'ordering')

最后来自我的网址文件:

router = routers.DefaultRouter()
router.register(r'county', CountyViewSet)
urlpatterns = [
    url(r'^', include(router.urls)),
]

4 个答案:

答案 0 :(得分:0)

您可以发布实际观点的代码吗?

您是否在视图中定义了renderer_classes?因为这会覆盖默认设置。

class YourView(APIView):
    renderer_classes = (XMLRenderer, JSONRenderer, )

答案 1 :(得分:0)

您遇到的问题很可能是,尤其是在使用浏览器进行测试时,问题是在Accepts标头中的JSON之前。因此,Django REST框架正在渲染XML,因为您特别要求它,即使它不是您所期望的。

通过向DRF提供默认渲染器列表,您告诉它“如果我不告诉您在我的视图中使用其他渲染器,请使用这些”。然后,DRF会将这些媒体类型与Accepts标头中的媒体类型进行比较,以确定要在响应中使用的最佳渲染器。除非您的Accepts标题中没有包含特定媒体类型,否则订单无关紧要,此时它应默认为列表中的第一个媒体类型。

答案 2 :(得分:0)

我的解决方案:文件renderers.py

from rest_framework.negotiation import DefaultContentNegotiation

class IgnoreClientContentNegotiation(DefaultContentNegotiation):

    logger = logging.getLogger(__name__)
    def select_renderer(self, request, renderers, format_suffix):
        """
        Select the first renderer in the `.renderer_classes` list.
        """
        # Allow URL style format override.  eg. "?format=json
        format_query_param = self.settings.URL_FORMAT_OVERRIDE
        format = format_suffix or request.query_params.get(format_query_param)
        request.query_params.get(format_query_param), format))

        if format is None:
            return (renderers[0], renderers[0].media_type)
        else:
            return DefaultContentNegotiation.select_renderer(self, request, renderers, format_suffix)

现在只需添加到

中的settings.py即可
REST_FRAMEWORK = { 
 (...)
'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'myapp.renderers.IgnoreClientContentNegotiation',
}

答案 3 :(得分:0)

塞尔吉奥的答案是正确的。

只需为以后遇到的任何人添加更多详细信息即可。

  1. 将djangorestframework-xml添加到pipfile

  2. 更新

RENDERER_CLASSES = (
    'rest_framework.renderers.JSONRenderer',
    'rest_framework_xml.renderers.XMLRenderer',
)
REST_FRAMEWORK = {
   ...
    'DEFAULT_RENDERER_CLASSES': RENDERER_CLASSES,
}
  1. 将rest_framework_xml添加到INSTALLED_APPS
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_xml',
]
  1. 遵循Sérgio关于创建'renderers.py'的建议