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數據

相關文章
相關標籤/搜索