drf分頁器

一梢睛、分頁器(三種)如何使用

1肥印、內(nèi)置了三種分頁器

PageNumberPagination:普通分頁
LimitOffsetPagination:偏移分頁
CursorPagination:游標(biāo)分頁

2、使用

from rest_framework.viewsets import ViewSetMixin,GenericViewSet
from rest_framework.mixins import ListModelMixin
from app01 import models,serializer
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
#PageNumberPagination:普通分頁(用的最多)
class MyPageNumberPagination(PageNumberPagination):
    page_size = 4   # 每頁顯示多少條
    page_query_param = 'page'   # 查詢參數(shù)
    page_size_query_param = 'size'   # 查詢的時(shí)候指定每頁顯示多少條
    max_page_size = 5   # 每頁最多顯示多少條
’‘’
    -使用方式:
        -定義一個(gè)類绝葡,繼承PageNumberPagination
        -重寫四個(gè)屬性
        -在繼承了GenericAPIView+ListModelMixin視圖類中配置
            pagination_class = MyPageNumberPagination
        -查詢
            http://127.0.0.1:8000/students/?page=1&size=5
‘’‘
#偏移分頁
class MyLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 2    # 默認(rèn)條數(shù)
    limit_query_param = 'limit'   # 查詢時(shí)深碱,指定查詢多少條
    offset_query_param = 'offset'   # 查詢時(shí),指定的起始位置是哪
    max_limit = None  # 查詢時(shí)藏畅,最多返回多少條
’‘’
-使用方式:
        -定義一個(gè)類敷硅,繼承LimitOffsetPagination
        -重寫四個(gè)屬性
        -在繼承了GenericAPIView+ListModelMixin視圖類中配置
            pagination_class = MyPageNumberPagination
        -查詢
        http://127.0.0.1:8000/students/?limit=100&offset=1
‘’‘
#游標(biāo)分頁(速度快)
class MyCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'   # 查詢的時(shí)候,指定的查詢方式
    page_size = 2   # 每頁顯示多少條
    ordering = 'id'   # 排序方式
    # page_size_query_param = 'size'    # 查詢的時(shí)候指定每頁顯示多少條
    # max_page_size = None  #  每頁最多顯示多少條
’‘’
http://127.0.0.1:8000/students/?cursor  只能上下查詢
‘’‘
class StudentView(GenericViewSet,ListModelMixin):
    queryset = models.Student.objects.all()
    serializer_class = serializer.Studentserializer
    pagination_class = MyPageNumberPagination
    # pagination_class = MyLimitOffsetPagination
    # pagination_class = MyCursorPagination

3、APIView的分頁模式

#新建一個(gè)類绞蹦,繼承普通分頁力奋,重寫四個(gè)屬性
from rest_framework.views import APIView
class StudentApiView(APIView):
    def get(self,request):
        student_list = models.Student.objects.all()
        page = MyPageNumberPagination()   #實(shí)例化得到對(duì)象,只需要換不同的分頁類即可
        res = page.paginate_queryset(student_list,request,self)   #開始分頁
        ser = serializer.Studentserializer(res,many=True)
        return page.get_paginated_response(ser.data)

二幽七、全局異常的捕獲

1景殷、統(tǒng)一接口的返回方式,即便視圖函數(shù)執(zhí)行出錯(cuò)
2锉走、使用方式

#寫一個(gè)函數(shù)
from rest_framework.views import exception_handler
from rest_framework import status
def common_exception_handler(exc, context):
        response = exception_handler(exc, context)
        if response is None:
            response = Response({'code':999,'detail': '未知錯(cuò)誤'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
        return response
#在settings中配置
REST_FRAMEWORK = {
            'EXCEPTION_HANDLER':'app01.utils.common_exception_handler'
        }

3滨彻、通常情況下會(huì)記錄日志
-使用django日志記錄 ,xx.log文件中
-使用sentry(公司自己寫)日志記錄挪蹭,平臺(tái)(django)亭饵,查詢,統(tǒng)計(jì)梁厉,告警

三辜羊、封裝Response對(duì)象

#自定義一個(gè)類,繼承Response
from rest_framework.response import Response
class APIResponse(Response):
    def __init__(self,code=100,msg='成功',data=None,status=None,headers=None,content_type=None,**kwargs):
        dic = {'code':code,'msg':msg}
        if data:
            dic['data'] = data
        dic.update(kwargs)
        super().__init__(data=dic,status = status,template_name=None,headers=headers,exception=False,content_type=content_type)
#使用
from rest_framework.views import APIView
from app01 import util
class StudentApiView(APIView):
    def get(self,request):
        student_list = models.Student.objects.all()
        # page = MyPageNumberPagination()
        # res = page.paginate_queryset(student_list,request,self)
        # ser = serializer.Studentserializer(res,many=True)
        # return page.get_paginated_response(ser.data)
        ser = serializer.Studentserializer(student_list,many = True)
        return util.APIResponse(code=100,msg='查詢成功',data=ser.data,count=200,next='https://wwww.dand.com')

四词顾、自動(dòng)生成接口文檔

1八秃、借助于第三方:coreapi、swagger
2肉盹、在路由中

from rest_framework.documentation import include_docs_urls
path('docs/',include_docs_urls(title='圖書管理系統(tǒng)api'))

3昔驱、在配置文件中

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
    }

4、寫視圖類(需要加注釋)

class BookListCreateView(ListCreateAPIView):
        """
        get:
        返回所有圖書信息.
        asdfasfda

        post:
        新建圖書.
        """
        queryset = Student.objects.all()
        serializer_class = StudentSerializer

5上忍、只需要在瀏覽器輸入骤肛,就可以看到自動(dòng)生成的接口文檔

http://127.0.0.1:8000/docs/

注:在settings中注冊(cè)rest_framework

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窍蓝,隨后出現(xiàn)的幾起案子腋颠,更是在濱河造成了極大的恐慌,老刑警劉巖吓笙,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淑玫,死亡現(xiàn)場離奇詭異,居然都是意外死亡面睛,警方通過查閱死者的電腦和手機(jī)絮蒿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叁鉴,“玉大人歌径,你說我怎么就攤上這事∏酌” “怎么了回铛?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵狗准,是天一觀的道長。 經(jīng)常有香客問我茵肃,道長腔长,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任验残,我火速辦了婚禮捞附,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘您没。我一直安慰自己鸟召,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布氨鹏。 她就那樣靜靜地躺著欧募,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仆抵。 梳的紋絲不亂的頭發(fā)上跟继,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音镣丑,去河邊找鬼舔糖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛莺匠,可吹牛的內(nèi)容都是我干的金吗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趣竣,長吁一口氣:“原來是場噩夢啊……” “哼辽聊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起期贫,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎异袄,沒想到半個(gè)月后通砍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烤蜕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年封孙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讽营。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虎忌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橱鹏,到底是詐尸還是另有隱情膜蠢,我是刑警寧澤堪藐,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挑围,受9級(jí)特大地震影響礁竞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杉辙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一模捂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜘矢,春花似錦狂男、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至珍昨,卻和暖如春县耽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镣典。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工兔毙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兄春。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓澎剥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赶舆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哑姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容