【问题标题】:Custom django rest parser自定义 django rest 解析器
【发布时间】:2015-02-13 22:16:36
【问题描述】:

这是我的代码:

class lista_libros(APIView):
def post(self, request, format=None): #, format=None
    cadena64 = request.data
    xmlfile = base64.b64decode(cadena64)
    #serializer = PruebaSerializer(data = xmlfile)
    #if serializer.is_valid():
        #serializer.save()
        #return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(xmlfile)

这是我得到的:

<?xml version="1.0" encoding="utf-8"?>
<root>&lt;libro&gt;
&lt;nombre&gt;Juego de tronos&lt;/nombre&gt;
&lt;autor&gt;Pablo Perez.&lt;/autor&gt;
&lt;categoria&gt;Fantasia&lt;/categoria&gt;
&lt;editorial&gt;Mexicana&lt;/editorial&gt;
&lt;fecha_pub&gt;1992&lt;/fecha_pub&gt;
&lt;no_pag&gt;5000&lt;/no_pag&gt;
&lt;/libro&gt;</root>

为什么小于和大于符号看起来像 &lt 和 &gt 而不是

此代码仅用于尝试发布 base64 字符串并将其解码为 xml 文件。

【问题讨论】:

  • 您是否尝试在回复中添加content_type="text/xml; charset=utf-8"
  • 是的,我尝试过这种方式,但我仍然遇到同样的问题,当我尝试序列化它时我不能,因为 xmlfile 变量是一个字符串而不是一个 XML
  • 无效数据。需要字典,但得到了字符串。

标签: python django post django-rest-framework


【解决方案1】:

那是因为用于渲染响应的渲染器是 HTMLRenderer。 DRF 确定要使用的渲染器by using content negotiation

视图的有效渲染器集合总是定义为一个列表 类。进入视图时,REST framework 将执行内容 协商传入的请求,并确定最 合适的渲染器来满足请求。

内容协商的基本过程包括检查 请求的 Accept 标头,以确定它期望的媒体类型 响应。可选地,URL 上的格式后缀可用于 明确请求特定的表示。例如网址 http://example.com/api/users_count.json 可能是一个端点 总是返回 JSON 数据。

在 URL 的末尾使用 .xml,它应该选择 XMLRenderer。

为了限制对xml的响应,在你的视图中指定XMLRenderer:

class MyView(APIView):

    renderer_classes = (XMLRenderer,)

    ...

【讨论】:

  • 感谢您抽出宝贵时间回答!,我正在使用自定义解析器: from rest_framework.parsers import BaseParser from rest_framework import parsers class PlainTextParser(BaseParser): """ 纯文本解析器。""" media_type = "text/plain" format = 'UTF-8' render_style = 'text' def parse(self, stream, media_type=None, parser_context=None): #"text/plain; charset=utf-8" """只需返回一个表示请求正文的字符串。""" return stream.read()
  • 无效数据。需要字典,但得到了字符串。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2017-04-23
  • 2015-11-06
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多