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

1、解析器django

解析器的做用就是服务端接收客户端传过来的数据,把数据解析成本身能够处理的数据。本质就是对请求体中的数据进行解析。json

一、分类app

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

a、JSONParser框架

解析JSON数据类型post

b、FormParser优化

解析urlencode数据类型url

c、MultiPartParserspa

解析form-data数据类型rest

d、FileUploadParsercode

解析上传的文件

二、默认的解析器

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

三、重写parser_classes

在视图类中添加

parser_classes = [JSONParser]

2、渲染器

渲染器同解析器相反,它定义了框架按照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',
    ),
}

3、url控制

一、产生缘由

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

二、解决方式

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)),

三、路径

^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数据

相关文章
相关标签/搜索