在Django REST API中用新行将json数据发布为纯文本

1 人关注

我有一个python服务(web),我想用Django REST API输入带有新行的纯文本。比如说。

Input:

我想输入这个约束条件 with new line 在下面的django API内容表单中。见下图。

我将在检索帖子后通过一些计算得到输出结果 输入值 在APIView中。响应将是JSON格式的输出。比如说。 [ "01", "02", "03" ]

My problem 是当我试图张贴 input (带有新行的文本)。它给出的错误如下。

我怎样才能通过这个Python Django REST API输入(纯文本带换行),并将输出作为一个有序的json数组作为响应。

提前感谢您的指导

4 个评论
你以前有关于application/json文件的知识吗?你的内容是不正确的,伙计!
是的,我有知识。但我正在尝试新的东西,所以我不知道该如何去做。你可以在下面的图片链接中看到做的方法。 ibb.co/cxvhBH7
明白了,你错了。你应该建立一个能够处理读取文件的服务,然后对文件中的数据进行排序,并返回一个响应。这不是JSON输入,必须是FILE类型的输入(纯文本)。
哦,不。谢谢你的指导 @Vu Phan!它应该是通过API输入的文件,然后我应该读取该文件的文本并计算出结果。然后我需要将结果作为JSON数组返回。
python
django
django-rest-framework
miltonbhowmick
miltonbhowmick
发布于 2021-01-26
2 个回答
Radwan Abu-Odeh
Radwan Abu-Odeh
发布于 2021-01-26
已采纳
0 人赞同

如果你想把你的请求正文作为多行文本发送,你需要做一些事情。

  • Create a PlainTextParser
  • 之所以需要这样做,是因为DjangoRestFramework默认将JSONParser作为其默认程序,这就是为什么你会看到你所收到的错误信息。

    If you follow this GuidLine you will see how to implement it.

    import codecs
    from django.conf import settings
    from rest_framework.exceptions import ParseError
    from rest_framework.parsers import BaseParser
    class PlainTextParser(BaseParser):
        media_type = "text/plain"
        def parse(self, stream, media_type=None, parser_context=None):
            Parses the incoming bytestream as Plain Text and returns the resulting data.
            parser_context = parser_context or {}
            encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
                decoded_stream = codecs.getreader(encoding)(stream)
                text_content = decoded_stream.read()
                return text_content
            except ValueError as exc:
                raise ParseError('Plain text parse error - %s' % str(exc))
    
  • Add that parser to Django Rest Framework configuration
  • REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            'path.to.PlainTextParser' # Replace path.to with you project path to that class
    

    如果你想让它只在特定的视图上工作,你可以将它添加到其parser_classes中。

  • When you do your request in DjangoRestFramwork Browsable API, choose text/plain as your media type, and in your http client put Content-Type: text/plain
  • This should be it, I hope it helps.

    这里的最佳答案 @milton
    谢谢 @VuPhan ,我很欣赏你的评论。
    谢谢。我已经试过这个解析器的media-type=text/plain,它运行良好。@RadwanAbu-Odeh
    谢谢@RadwanAbu-Odeh的回答。我尝试了你的解决方案,它对纯文本有效。在实施你的解决方案后,我在其他API上面临一些问题。我得到了 Unsupported media type 的错误。 为了解决 unsupported media type 的问题,我不得不在 DEFAULT_PARSER_CLASSES 中添加更多的分析器。这些是。替换代码3】, rest_framework.parsers.MultiPartParser
    Ajay
    Ajay
    发布于 2021-01-26
    0 人赞同

    Try using 原始字符串字元 而不是你在做什么

        In [4]: n_s="This is \t Stack over \n flow"
        In [5]: r_s=r"This is  \t Stack over \n flow" 
        In [8]: print(n_s)
        This is      Stack over