我正在尝试构建一个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)),
]
答案 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)
塞尔吉奥的答案是正确的。
只需为以后遇到的任何人添加更多详细信息即可。
将djangorestframework-xml添加到pipfile
更新
RENDERER_CLASSES = (
'rest_framework.renderers.JSONRenderer',
'rest_framework_xml.renderers.XMLRenderer',
)
REST_FRAMEWORK = {
...
'DEFAULT_RENDERER_CLASSES': RENDERER_CLASSES,
}
INSTALLED_APPS = [
...
'rest_framework',
'rest_framework_xml',
]