码迷,mamicode.com
首页 > 其他好文 > 详细

Django REST Framework 解析器与渲染器

时间:2019-04-08 13:53:38      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:djang   定义   res   src   一个   ram   ret   cts   def   

 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/

 

Django REST Framework 解析器与渲染器

标签:djang   定义   res   src   一个   ram   ret   cts   def   

原文地址:https://www.cnblogs.com/pgxpython/p/10400054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!