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