• restframework 解析器、渲染器、url控制组件


    一、解析器

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

    1、分类

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

    a、JSONParser

    解析JSON数据类型

    b、FormParser

    解析urlencode数据类型

    c、MultiPartParser

    解析form-data数据类型

    d、FileUploadParser

    解析上传的文件

    2、默认的解析器

    DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
            'rest_framework.parsers.MultiPartParser'
        ]

    3、重写parser_classes

    在视图类中添加

    parser_classes = [JSONParser]

    二、渲染器

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

    默认设置

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

    局部设置

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

    全局设置

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

    三、url控制

    1、产生原因

    restframework视图组件,通过含参的as_view()解决了两个get的问题,实现了视图类的同一,但url仍然有两条

    2、解决方式

    a、原来

        path('author/', views.AuthorViewSet.as_view({'get': 'list', 'post': 'create'})),
        path('author/<pk>/', views.AuthorViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),

    b、优化

    from rest_framework import routers
    router = routers.DefaultRouter()
    router.register('author', views.AuthorViewSet)

    二级分发

    path('', include(router.urls)),

    3、路径

    ^author/$ [name='author-list']
    ^author.(?P<format>[a-z0-9]+)/?$ [name='author-list']
    ^author/(?P<pk>[^/.]+)/$ [name='author-detail']
    ^author/(?P<pk>[^/.]+).(?P<format>[a-z0-9]+)/?$ [name='author-detail']

    路由总结

    from django.urls import path, include
    from app01 import views
    from rest_framework import routers
    router = routers.DefaultRouter()
    #注册一个url,后续会生成我们想要的个url
    router.register('', views.PublishViewSet)
    # {'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}
    # {'get': 'list', 'post': 'create'}
    urlpatterns = [
    
        path('login/v1/', views.LoginView.as_view()),
    
    
        # path('publish/v1/', views.PublishView.as_view()),
        # path('publish/v1/<pk>/', views.PublishDetailView.as_view()),
    
        # path('publish/v1/', views.PublishViewSet .as_view({'get': 'list', 'post': 'create'})),
        # path('publish/v1/<pk>/', views.PublishViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
        # #将生成的url加入到路由中
        path('publish/v1/', include(router.urls)),
    ]

    补充

    a、?format=json

    http://127.0.0.1:8000/author/?format=json

    作用:获取json格式的数据,没有其它装饰

    b、.json

    http://127.0.0.1:8000/author.json

    作用:获取全部json数据

    http://127.0.0.1:8000/author/6.json

    作用:获取指定pk的json数据

  • 相关阅读:
    Linux系统介绍(二)文件系统结构
    为Docker Swarm添加调度策略
    Docker 三剑客之 Docker Swarm
    Hadoop中文文档
    hadoop 学习笔记:mapreduce框架详解
    Java进阶-- GUI
    ceph(8)--关于Ceph PGs
    今天在学习NTP时发现了2个网站
    开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
    Switch能否用string做参数
  • 原文地址:https://www.cnblogs.com/wt7018/p/11470609.html
Copyright © 2020-2023  润新知