一、解析器
解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。
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数据