01-解析器
REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求。还支持定义自己的自定义解析器,这使你可以灵活地设计API接受的媒体类型。
注意: 开发客户端应用程序时应该始终记住在HTTP请求中发送数据时确保设置Content-Type
头。
如果你不设置内容类型,大多数客户端将默认使用'application/x-www-form-urlencoded'
,而这可能并不是你想要的。
举个例子,如果你使用jQuery的.ajax() 方法发送json
编码数据,你应该确保包含contentType:'application / json'
设置。
02-全局配置解析器
# 全局配置 REST_FRAMEWORK = { # 版本 "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning", # 解析器 "DEFAULT_PARSER_CLASSES": ( "rest_framework.parsers.JSONParser", "rest_framework.parsers.FormParser" ) }
注意:
1. 当你的项目中只配置了 JSONParser 解析器时,你的项目现在就只能解析JSON格式的数据了,客户端如果使用浏览器提交,那么你将无法解析。
2. 在视图类中定义的配置项的优先级要高于全局配置中的配置项。
03-单个视图配置解析器
class BookViewSet(ModelViewSet): queryset = models.Book.objects.all() serializer_class = BookModelSerializer # JSONParser:表示只能解析content-type:application/json的头 # FormParser:表示只能解析content-type:application/x-www-form-urlencoded的头 parser_classes = [JSONParser, ]
04-自定义解析器
要实现一个自定义解析器,你应该重写BaseParser
,设置.media_type
属性,并实现.parse(self,stream,media_type,parser_context)
方法。
该方法应该返回用于填充request.data
属性的数据。
class PlainTextParser(BaseParser): """ Plain text 解析器。 """ media_type = 'text/plain' def parse(self, stream, media_type=None, parser_context=None): """ 只需返回一个表示请求正文的字符串。 """ return stream.read()
05-渲染器
视图的有效渲染器集合始终被定义为一个元素都是类的列表。当输入视图时,REST框架将对传入请求执行内容协商,并确定最适合的渲染器来满足请求。
drf提供的渲染器有很多,默认是:
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ) }
06-全局设置
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', ), }
注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。
07-局部设置
class PublisherViewSet(ModelViewSet): queryset = models.Publisher.objects.all() serializer_class = PublisherModelSerializer renderer_classes = [JSONRenderer, ]
这样设置后就只能返回JSON格式的数据了,并不会像之前一样提供一个阅读友好的web页面。
详解:https://q1mi.github.io/Django-REST-framework-documentation/api-guide/renderers_zh/