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
方法
查看 BaseParser
中 parse
方法,
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
),
}