拓展RDF支持text/plain请求头 @ systemime | 2022-01-18T14:26:18+08:00 | 3 分钟阅读 | 更新于 2022-01-18T14:26:18+08:00

django-rest-framework框架默认不支持Content-Type请求头中媒体类型为text/plain的请求,但我们确实要面对这样的场景,这里说明如何拓展

DRF文档: https://www.django-rest-framework.org/api-guide/parsers/#api-reference

1. 编写自定义请求解析器

参考文档,我们知道如果需要实现一个按照Content-Type内容进行解析的解析器,我们需要先继承 rest_framework.parsers.BaseParser,并指明媒体类型,即设置 media_type 属性,并实现 parse 方法

查看 BaseParserparse 方法,

class BaseParser:
    """
    All parsers should extend `BaseParser`, specifying a `media_type`
    attribute, and overriding the `.parse()` method.
    """
    media_type = None

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Given a stream to read from, return the parsed representation.
        Should return parsed data, or a `DataAndFiles` object consisting of the
        parsed data and files.
        """
        raise NotImplementedError(".parse() must be overridden.")

其中主要参数为 stream,表示请求正文的类流对象,对于媒体类型为 text/plain 的请求,这里将流数据读取并返回,具体实现如下

# your_proj.your_path.parsers.py
from rest_framework.parsers import BaseParser


class PlainTextParser(BaseParser):

    media_type = "text/plain"

    def parse(self, stream, media_type=None, parser_context=None):
        return stream.read()

2. 使用自定义请求解析器

DRF的处理组件如:序列化器、权限校验器、过滤器、分页器都有两种加载方案

  • 第一种是直接在settings.py中设置 REST_FRAMEWORK, 参考 rest_framework.settings.py 中默认配置,可以覆盖默认配置并对自己的项目全局生效,

  • 第二种方案就是在视图类(继承自DRF视图类的视图)上指定不同属性对应的类,

2.1 全局使用

在django项目配置文件夹的settings.py文件夹中,添加如下配置

REST_FRAMEWORK = {
    "DEFAULT_PARSER_CLASSES": [
        "rest_framework.parsers.JSONParser",  # 默认json解析器
        "rest_framework.parsers.FormParser",  # 默认from表单解析器
        "rest_framework.parsers.MultiPartParser",  # 默认默认多表单解析器
        # "rest_framework.parsers.FileUploadParser",  # 默认文件上传解析器
        ...
        "your_proj.your_path.parsers.PlainTextParser",  # 自定义的解析器
    ],
}

2.2 指定某视图使用

视图中使用只需要指定 parser_classes 属性即可,如

# views.py

from rest_framework.generics import GenericAPIView
from your_proj.your_path.parsers import PlainTextParser

class YourView(GenericAPIView):

    parser_classes = [PlainTextParser]

    ...

3.第三方解析器

3.1 YAML

【项目地址】:https://github.com/jpadilla/django-rest-framework-yaml

安装

pip install djangorestframework-yaml

使用

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_yaml.parsers.YAMLParser',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_yaml.renderers.YAMLRenderer',
    ],
}

3.2 XML

【项目地址】:https://github.com/jpadilla/django-rest-framework-xml

安装

pip install djangorestframework-xml

使用

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework_xml.parsers.XMLParser',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework_xml.renderers.XMLRenderer',
    ],
}

3.3 MessagePack

【项目地址】:https://github.com/juanriaza/django-rest-framework-msgpack

安装

pip install djangorestframework-msgpack

使用

最后更新于2017年,文档已不可访问,可参考其源码

3.4 CamelCase JSON

【项目地址】:https://github.com/vbabiy/djangorestframework-camel-case

安装

pip install djangorestframework-camel-case

使用

REST_FRAMEWORK = {

    'DEFAULT_RENDERER_CLASSES': (
        'djangorestframework_camel_case.render.CamelCaseJSONRenderer',
        'djangorestframework_camel_case.render.CamelCaseBrowsableAPIRenderer',
        # Any other renders
    ),

    'DEFAULT_PARSER_CLASSES': (
        # If you use MultiPartFormParser or FormParser, we also have a camel case version
        'djangorestframework_camel_case.parser.CamelCaseFormParser',
        'djangorestframework_camel_case.parser.CamelCaseMultiPartParser',
        'djangorestframework_camel_case.parser.CamelCaseJSONParser',
        # Any other parsers
    ),
}

© 2018 - 2022 systemime 的博客

Powered by Hugo with theme Dream.

---

avatar
关于我

systemime 的博客

记录一些生活与技术的事或思考

毕业于 🏫 山东科技大学泰山科技学院

目前职位为Python后端开发工程师

热爱代码,热爱开源

主要的技术栈是:

  • python
  • celery
  • django
  • shell
  • sql
  • go
  • nginx

爱好

  • 羽毛球
  • 编码
我的一些开源项目

计划或项目:

  • skill_test ➡️ 一个包含项目常用的django模板:常用脚本、单测方法、数据库连接池、异步请求池,restful风格的回调接口管理器 60%
  • Vbox ➡️ 一个基于k8s和docker的容器云平台,早期项目代码较简单 90%
  • YuQue-Assistant ➡️ 用于批量拉取语雀工作区文章,使用进程池+协程
  • 一个代理池 60%
  • simple_db_pool ➡️ 一个简单数据库连接池 100%
  • 一个电报消息转发脚本 90%
  • 使用flutter做一个app 计划中
  • 其他若干脚本(bilibili、微博图片视频下载、文件对比、图片颜色提取…)
其他

如果你喜欢我的博客、开源项目或者它们可以给你带来帮助,可以赏一杯咖啡 ☕ 给我。~

If you like my open source projects or they can help you. You can buy me a coffee ☕.~

PayPal

https://paypal.me/systemime

支付宝赞赏码

alipay

微信赞赏码

wechat

最好附加一下信息或者留言,方便我可以将捐助记录 📝 下来,十分感谢 🙏。

It is better to attach some information or leave a message so that I can record the donation 📝, thank you very much 🙏.