DRF 之 URL控制、解析器、响应器、版本控制、分页器

本文介绍了Django Rest Framework(DRF)中的URL控制,包括基本路由写法、ViewSetMixin的使用以及ModelViewSet自动生成的路由。接着讨论了解析器的全局和局部配置,以及请求数据的解析流程。然后,概述了响应器的全局和局部配置,说明其默认使用情况。文章还涵盖了版本控制的全局配置,以及如何在视图类中获取当前访问的版本。最后,详细阐述了DRF中的分页策略,包括常规分页、偏移分页和cursor游标方式的使用和参数说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

url控制

基本路由写法:

url(r'^publish/', views.PublishView.as_view()),

第二种写法(只要继承了ViewSetMixin):

url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})),
url(r'^publish\.(?P<format>\w+)$', views.PublishView.as_view({'get':'list','post':'create'})),
url(r'^publish/(?P<pk>\d+)$', views.PublishView.as_view({'get':'retrieve','delete':'destroy','put':'update'})),

第三种(自动生成路由,必须继承ModelViewSet):
SimpleRouter 自动生成两条路由:

from rest_framework.routers import SimpleRouter,DefaultRouter
router=SimpleRouter()
router.register('publish',views.PublishView)
、、、、
url(r'', include(router.urls)),

DefaultRouter自动生成四条路由:

from rest_framework.routers import SimpleRouter,DefaultRouter
router=DefaultRouter()
router.register('publish',views.PublishView)
、、、、
url(r'', include(router.urls)),

解析器

解析器一般不需要修改,项目最开始全局配置一下就可以了,作用是控制我的视图类能够解析前端传过来的格式是什么样的

全局使用

在setting中配置:

REST_FRAMEWORK = {
    "DEFAULT_PARSER_CLASSES":[
        'rest_framework.parsers.JSONParser',
    ]
}

局部使用

在视图类中:

from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
# 默认可以解析三种格式
parser_classes=[JSONParser,]

源码流程:
1- 当调用request.data的时候去执行解析方法
2- 根据传过来的编码方式选择一个解析器对象,调用解析器对象的parser方法完成解析

响应器

一般响应器是不需要进行配置的直接使用即可

from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer

全局使用

在setting中配置:

'DEFAULT_RENDERER_CLASSES':[xxx,xxx]

局部使用

在视图类中配置:

renderer_classes = [JSONRenderer, BrowsableAPIRenderer]	

版本控制

版本控制

全局使用

在setting中配置:

'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
'VERSION_PARAM': 'version'  # URL中获取值的key

路由需要修改:

-url(r'^(?P<version>[v1|v2]+)/test/', views.Test.as_view()),

在视图类中就可以通过:request.version取出当前访问哪个版本,相应的取执行相应版本的代码。

分页器

常规分页

基本使用:

-page=PageNumberPagination实例化产生对象
-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
-再序列化,序列化该返回值

四个参数:

# 每页显示多少条
page.page_size=3
# 查询指定查询哪一页的key值
page.page_query_param='xxx'
# 前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条
page.page_size_query_param='size'
# 控制每页最大显示多少,size如果传100,最多也是显示10
page.max_page_size=10
from rest_framework.pagination import PageNumberPagination
class PublishView(APIView):
    def get(self,request,*args,**kwargs):
        #查询出所有数据
        ret=models.Publish.objects.all()
        #实例化产生一个普通分页对象
        page=PageNumberPagination()
        #每页显示多少条
        page.page_size=3
        #查询指定查询哪一页的key值
        page.page_query_param='xxx'

        #前端控制每页显示多少条的查询key值比如size=9,表示一页显示9条
        page.page_size_query_param='size'
        #控制每页最大显示多少,size如果传100,最多也是显示10
        page.max_page_size=10
        ret_page=page.paginate_queryset(ret,request,self)
        #序列化
        pub_ser=serializer.PublishSerializers(ret_page,many=True)
        #去setting中配置每页显示多少条
        return Response(pub_ser.data)

偏移分页

基本使用:

-page=LimitOffsetPagination实例化产生对象
-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
-再序列化,序列化该返回值

四个参数:

#从标杆位置往后取几个,默认取3个,我可以指定
page.default_limit=3
#每次取得条数
page.limit_query_param='limit'
#标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取
page.offset_query_param='offset'
#最大取10条
page.max_limit=10
from rest_framework.pagination import LimitOffsetPagination
class PublishView(APIView):
    def get(self, request, *args, **kwargs):
        ret = models.Publish.objects.all()
        # 实例化产生一个偏移分页对象
        page = LimitOffsetPagination()
        #四个参数:
        #从标杆位置往后取几个,默认取3个,我可以指定
        page.default_limit=3
        #每次取得条数
        page.limit_query_param='limit'
        #标杆值,现在偏移到哪个位置,如果offset=6 表示当前在第6条位置上,往后取
        page.offset_query_param='offset'
        #最大取10条
        page.max_limit=10
        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = serializer.PublishSerializers(ret_page, many=True)
        # 去setting中配置每页显示多少条
        return page.get_paginated_response(pub_ser.data)
        # return Response(pub_ser.data)

cursor游标方式

基本使用:

-page=CursorPagination实例化产生对象
-返回值=page.paginate_queryset(ret,request,self):ret是要分页的所有数据,
-再序列化,序列化该返回值

四个参数:

#每页显示的大小
page.page_size=3
#查询的key值
page.cursor_query_param='cursor'
# 按什么排序
page.ordering='id'

注意:get_paginated_response:调用这个方法返回的数据中会有总条数,上一页地址,下一页地址

from rest_framework.pagination import CursorPagination
class PublishView(APIView):
    def get(self, request, *args, **kwargs):
        ret = models.Publish.objects.all()
        # 实例化产生一个偏移分页对象
        page = CursorPagination()
        #三个参数:
        #每页显示的大小
        page.page_size=3
        #查询的key值
        page.cursor_query_param='cursor'
        # 按什么排序
        page.ordering='id'
        ret_page = page.paginate_queryset(ret, request, self)
        # 序列化
        pub_ser = serializer.PublishSerializers(ret_page, many=True)
        # 去setting中配置每页显示多少条
        return page.get_paginated_response(pub_ser.data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值