• Django REST framework解析器和渲染器


    解析器

    解析器的作用

    解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。

    在了解解析器之前,我们要先知道Accept以及ContentType请求头。

    Accept : 是告诉对方我能解析什么样的数据,通常也可以表示我想要什么样的数据。

    ContentType : 是告诉对方我给你的是什么样的数据类型

    解析器工作原理的就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们在后端使用相应的解析器去解析数据。

    Django中的数据解析

    在视图中我们可以通过request.POST来获取前端发来的请求数据,那么Django框架是如何拿到请求体中的数据的呢?我们一起来看一下:

    首先,request对象是 WSGIRequest 类的实例化对象,那我们去看一下代码:

    from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser

     

     

     # reset_framawork 默认路由

    from django.contrib import admin
    from django.urls import path,re_path
    from app01 import views
    from rest_framework import  routers
    from django.conf.urls import url,include
    
    
    routers = routers.DefaultRouter()
    routers.register("authors", views.AuthorModelView)
    
    
    
    urlpatterns = [
        re_path(r'^',include(routers.urls)),
    
        # re_path(r'^admin/', admin.site.urls),
        # re_path(r'^publishes/$', views.PublishView.as_view(),name="publish"), #  View:view(request)=====APIView:dispatch()
        # re_path(r'^publishes/(?P<pk>d+)/$', views.PublishDetailView.as_view(),name="detailpublish"), #  View:view(request)=====APIView:dispatch()
        #
        # re_path(r'^books/$', views.BookView.as_view(),name="books"),
        # re_path(r'^books/(d+)/$', views.BookDetailView.as_view(),name="detailbook"),
        #url(r'^books/(d+)/$', View:view),     # view(request)
    
        # re_path(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
        # re_path(r'^authors/(?P<pk>d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
    
        re_path(r'^login/$', views.LoginView.as_view(),name="login"),
    
    ]

     

    此时我们回想在Django的视图中通过request.POST和request.FILES能够取到数据都是因为在这里把请求的数据解析,并赋值给request对象了。

    同时我们还会发现一个问题就是,Django的解析器是不支持 ContenType为 application/json 的,也就是说无法解析json格式的数据

    DRF中的解析器

    我们都知道在DRF中获取请求提交的数据是通过访问request.data,那么request.data的数据是从哪里来的呢?我们通过源码来看一下:

     

     

    如果没有配置解析器,DRF会使用默认的解析器:

    我们可以在单个视图或者全局的settings.py中配置要使用的解析器。

    from rest_framework.response import Response

    单个视图配置

    class BookViewSet(ModelViewSet):
        queryset = models.Book.objects.all()
        serializer_class = BookModelSerializer
        parser_classes = [JSONParser, ]

    全局配置

     

    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': (
            'rest_framework.parsers.JSONParser',
        )
    }

    注意:当你的项目中只配置了 JSONParser 解析器时,你的项目现在就只能解析JSON格式的数据了,客户端如果使用浏览器提交,那么你将无法解析。

    注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项

    渲染器(rander)

    渲染器同解析器相反,它定义了框架按照content_type来返回不同的响应。

    DRF提供的渲染器有很多,默认是

     'DEFAULT_RENDERER_CLASSES': (
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ),

    我们也可以在视图中局部设置也可以在全局的settings.py中进行设置:

    局部设置

     own:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from django.shortcuts import HttpResponse
    from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
    
    """
    最常用:
    JSONRenderer : 按照json格式数据返回。
    BrowsableAPIRenderer :rest_framwork提供友好页面渲染(不加就是单调的页面)
    
    
    """
    
    
    class CourseView(APIView):
        renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    
        def get(self, request, *args, **kwargs):
            return Response('1111111111')
    View Code

    class PublisherViewSet(ModelViewSet):
        queryset = models.Publisher.objects.all()
        serializer_class = PublisherModelSerializer
        renderer_classes = [JSONRenderer, ]

    这样设置后就只能返回JSON格式的数据了,并不会像之前一样提供一个阅读友好的web页面。

    全局设置

     

    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': (
            'rest_framework.renderers.JSONRenderer',
        ),
    }

    注意,在视图类中定义的配置项的优先级要高于全局配置中的配置项。

  • 相关阅读:
    [leetCode]404. 左叶子之和
    [leetCode]572. 另一个树的子树
    [leetCode]226. 翻转二叉树
    [leetCode]637. 二叉树的层平均值
    [leetCode]102. 二叉树的层序遍历
    [leetCode]590. N叉树的后序遍历
    [leetCode]589. N叉树的前序遍历
    [leetCode]145. 二叉树的后序遍历
    [leetCode]94. 二叉树的中序遍历
    [leetCode]381. O(1) 时间插入、删除和获取随机元素
  • 原文地址:https://www.cnblogs.com/Rivend/p/11871719.html
Copyright © 2020-2023  润新知