drf(十)路由与渲染器

drf(十)路由与渲染器

1.路由系统

1.1 自定义路由

# http://127.0.0.1:8000/api/v1/v1/?format=json # 以json的形式进行渲染
url(r'^(?P<version>[v1|v2]+)/v1/$', views.View1View.as_view({'get': 'list','post':'create'})),
# http://127.0.0.1:8000/api/v1/v1.json # 将渲染格式直接放进路由中
url(r'^(?P<version>[v1|v2]+)/v1\.(?P<format>\w+)$', views.View1View.as_view({'get': 'list','post':'create'})),

'''以下是查询数据时候的路由'''
url(r'^(?P<version>[v1|v2]+)/v1/(?P<pk>\d+)/$', views.View1View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
url(r'^(?P<version>[v1|v2]+)/v1/(?P<pk>\d+)\.(?P<format>\w+)$', views.View1View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),

1.2 自动生成路由

from django.contrib import admin
from django.urls import path,re_path,include
from app01.views import auth,permission,api
from api import views
from api.viewss import pagers,view
from rest_framework import routers

router=routers.DefaultRouter()
router.register(r'rt',view.View3View)

urlpatterns = [
    # 避免了自己手写as_view()的参数。
    re_path(r'^api/(?P<version>[v1|v2]+)/',include(router.urls)),
]

image-20220411142604982

image-20220411142635793

注:一般自动生成路由的时候只在使用增删改查(ModelViewSet)的时候进行使用,当只是用部分功能的时候(增删)可以进行手动编写

2.渲染器

2.1 普通渲染

class TestView(APIView):
    def get(self,request,*args,**kwargs):
        roles=models.Role.objects.all()

        # 创建分页对象
        pg=MyPageNumberPagination()
        pager_roles=pg.paginate_queryset(queryset=roles,request=request,view=self)
        # 对数据进行序列化,将分页数据进行序列化
        ser=RoleSerializers(instance=pager_roles,many=True)
        # 使用渲染器进行放回
        return Response(ser.data)

image-20220411143631515

路由渲染:传入参数?format=json

image-20220411143759407

2.2 渲染器渲染

from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class TestView(APIView):
    renderer_classes = [JSONRenderer,] #只是用json进行渲染
    def get(self,request,*args,**kwargs):
        roles=models.Role.objects.all()
        # 创建分页对象
        pg=MyPageNumberPagination()
        # 在数据库中获取分页数据
        pager_roles=pg.paginate_queryset(queryset=roles,request=request,view=self)
        # 对数据进行序列化,将分页数据进行序列化
        ser=RoleSerializers(instance=pager_roles,many=True)
        # 使用渲染器进行放回
        return Response(ser.data)

image-20220411143941701

renderer_classes = [JSONRenderer,BrowsableAPIRenderer] #添加浏览器的显示

image-20220411144215085

配置文件全局设置

image-20220411144547143

REST_FRAMEWORK={
    # "DEFAULT_AUTHENTICATION_CLASSES":['app01.utils.auth.MyAuthentication',],
    # "UNAUTHENTICATED_USER":None, # 匿名,request.user = None
    # "UNAUTHENTICATED_TOKEN":None,
    # "DEFAULT_PERMISSION_CLASSES":['app01.utils.permission.MyPermission',],
    # "DEFAULT_THROTTLE_CLASSES":['app01.utils.throttle.MyThrottle',],# 匿名用户不能在全局配置需要为登录功能单独添加
    "DEFAULT_THROTTLE_RATES":{
        "visit":'3/m',#一分钟三次,匿名用户
        "loginuser":'10/m',# 登录成功,一分钟10次
    },
    "PAGE_SIZE":2,
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
    "DEFAULT_VERSION":'v1',
    "ALLOWED_VERSIONS":['v1','v2'], #允许的版本号
    "VERSION_PARAM":"version",# 这个参数应该和 路由中的名称相同version/
    "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser'],
    "DEFAULT_RENDERER_CLASSES":['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer']
}

继续努力,终成大器!

posted @ 2022-04-11 14:51  紫青宝剑  阅读(68)  评论(0编辑  收藏  举报