渲染器
简介
什么是渲染器
根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
渲染器的作用
序列化、友好的展示数据
渲染器配置
首先要在settins.py中将rest_framework组件加进去
局部配置渲染器
引入渲染器类,然后将他们作为一个列表的元素赋值给renderer_classes 配置属性,如下:
|
1
2
3
4
5
6
|
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookViewSet(APIView):
renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
def get(self,request):
return Response('...')
|
BrowsableAPIRenderer的渲染效果如下
|
1
|
JSONRenderer类的就是只渲染数据,如下: |
可以看到,只是简单的数据展示
全局配置渲染器
在setting.py文件中加入如下配置:
|
1
2
3
4
5
|
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],
...} |
解析器
我们都知道,网络传输数据只能传输字符串格式的,如果是列表、字典等数据类型,需要转换之后才能使用
但是我们之前的rest_framework例子都没有转换就直接可以使用了,这是因为rest_framework有一套解析器,
默认他会帮我们转换3种类型的数据,分别是,JSONParser,FormParser,MultiPartParser
局部解析器
如果我们需要转换其他数据,需要在视图类里配置parser_classes参数,如下:
|
1
2
|
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser,FileUploadParser
parser_classes = [JSONParser,FormParser,FileUploadParser]
|
全局解析器
REST_FRAMEWORK={
"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}
路由控制
我们之前在写例子的时候,视图类已经封装到最精简版本了,但是url变的比之前复杂了,如下:
|
1
2
|
url(r'^publishes/$', views.PublishViewSet.as_view({'get':'list','post':'create'})),
url(r'^publishes/(?P<pk>\d+)/$', views.PublishViewSet.as_view({'get':'retrieve','put':'update','delete':'destroy','patch':'partial_update'})),
|
上面只是一个视图类对应的url,如果项目做的很大,那么url会变的非常臃肿,
而rest_framework给我们封装了一种自动注册url的功能,格式如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import include
from rest_framework import routers
# 实例化一个routers对象routers = routers.DefaultRouter()
# 往对象里注册(添加)urlrouters.register('publishes',views.PublishViewSet)
|
然后,在urlpatterns中添加已经注册的url(在routers.urls里),如下:
|
1
|
url(r'',include(routers.urls)) |
完整版的urlpatterns配置
|
1
2
3
4
5
6
7
8
9
10
11
|
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.Login.as_view()),
url(r'^authors/$', views.AuthorsView.as_view()),
url(r'^authors/(\d+)/$', views.AuthorsDetailView.as_view()),
url(r'',include(routers.urls))
] |
这个时候,rest_framework会帮我们自动添加了4个url,如下图:
示例
from django.contrib import admin from django.urls import path,re_path,include urlpatterns = [ re_path("testrestfulframework/",include("testrestfulframework.urls")), ] ####### testrestfulframework.urls.py ########### from django.urls import path,re_path,include from testrestfulframework import views from rest_framework import routers # 实例化一个routers对象 routers = routers.DefaultRouter() # 往对象里注册(添加)url routers.register('books', views.BookViewSet) routers.register('publish', views.PublishViewSet) urlpatterns = [ # re_path(r"login/$",views.LoginViewSet.as_view()), # re_path(r"books/$",views.BookViewSet.as_view()), # re_path(r"books/(?P<pk>\d+)$",views.BookDetailViewSet.as_view()), re_path(r'',include(routers.urls)), ] urls.py