• 07 Django REST Framework 解析器与渲染器


     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/

  • 相关阅读:
    在python中添加自定义模块
    jquery图片延时加载
    java的内部类与匿名类
    Oracle数据库优化器的优化方式
    JS实现画线(兼容所有浏览器)
    Ext中window的用法
    关于工作流WEB设计器的一些问题
    ORACLE EBS 价目表的导入功能存储过程BUG
    EXT编程实现人员信息的添加
    用户交互式垃圾回收机制
  • 原文地址:https://www.cnblogs.com/pgxpython/p/10400054.html
Copyright © 2020-2023  润新知