二十三、分页与限流
创始人
2025-05-28 23:28:44
0

一、分页

对于大量数据的传输需要进行分页操作。

REST framework已经实现了分页api。它支持:

  • 将分页的链接作为响应内容的一部分,这是默认的方案。
  • 响应头中包含分页链接,如Content-RangeLink

注意只有在使用通用视图或视图集时,分页才会自动执行。如果你使用一个常规的APIView,你需要自己调用分页API来确保你返回一个分页的响应。

(1)分页设置

REST framework中可以对分页功能进行全局设置,例如:

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 100
}

注意,您需要同时设置DEFAULT_PAGINATION_CLASSPAGE_SIZE,它们的默认值都为None,表示不使用分页。

还可以使用pagination_class属性在单个视图上设置分页类。

(2)修改分类样式

如果希望修改分页样式的特定方面,则需要覆盖其中一个分页类,并设置要更改的属性。

class LargeResultsSetPagination(PageNumberPagination):page_size = 1000page_size_query_param = 'page_size'max_page_size = 10000class StandardResultsSetPagination(PageNumberPagination):page_size = 100page_size_query_param = 'page_size'max_page_size = 1000

然后你可以使用pagination_class属性将你的新样式应用到视图中:

class BillingRecordsView(generics.ListAPIView):queryset = Billing.objects.all()serializer_class = BillingRecordsSerializerpagination_class = LargeResultsSetPagination

当然也可以进行全局配置。

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'apps.core.pagination.StandardResultsSetPagination'
}

(3)DRF内置分页类

这是一个简单的页码的分页类。

PageNumberPagination

请求案例

GET https://api.example.org/accounts/?page=4

响应

HTTP 200 OK
{"count": 1023"next": "https://api.example.org/accounts/?page=5","previous": "https://api.example.org/accounts/?page=3","results": […]
}

使用

同分页设置一样,全局使用配置如下:

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination','PAGE_SIZE': 100
}

GenericAPIView的子类通过在每个视图中设置pagination_class属性来应用分类。

配置

可以像上面一样复写下面的属性,来修改分类样式。

  • django_paginator_class - django框架分页类。默认使用django.core.paginator.Paginator
  • page_size - 表示一页数据条数的数值。如果设置会覆盖设置中的PAGE_SIZE
  • page_query_param - 一个字符串参数名,表示查询的页码,默认是page
  • page_size_query_param - 一个字符串参数名,表示查询的每页数据数量。默认为None表示不能过客户端控制每页数据量。
  • max_page_size - 每页的最大数据量,和page_size_query_param配合使用。

LimitOffsetPagination 

这种分页样式使用了在查找多个数据库记录时使用的语法。 客户端包含一个limit和一个offset查询参数。limit表示要返回的最大项数,与其他样式中的page_size相同。offset表示查询相对于完整的未分页项集的起始位置。

请求

GET https://api.example.org/accounts/?limit=100&offset=400

响应

HTTP 200 OK
{"count": 1023"next": "https://api.example.org/accounts/?limit=100&offset=500","previous": "https://api.example.org/accounts/?limit=100&offset=300","results": […]
}

使用

同分页设置一样,全局使用配置如下:

REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 100
}

GenericAPIView的子类中通过在每个视图中设置pagination_class属性来应用分类。

配置 

可以像上面一样复写下面的属性,来修改分类样式。

  • default_limit - 一个数字值,表示客户端在查询参数中未提供limit时所使用的值。默认值与PAGE_SIZE设置键相同。
  • limit_query_param - 一个字符串,表示limit参数的参数名,默认为limit
  • offset_query_param - 一个字符串,表示offset参数的参数名,默认为offset
  • max_limit - 如果设置,这是一个数字,表示最大允许客户端请求的limit,默认为None

二、限流

限流类似于权限,它决定是否应该授权请求。限流表示一种临时状态,用于控制客户端可以向API发出的请求速率。与权限一样,可以使用多个节流。对于未经身份验证的请求,您的API可能有一个限制性的节流,而对于经过身份验证的请求,限制较少。

另一个可能需要使用多个节流的场景是,由于某些服务特别耗费资源,因此需要对API的不同部分施加不同的约束。

如果您想同时施加突发请求量和持续请求量限流,还可以使用多个限流器。例如,您可能希望限制用户每分钟最多60个请求,每天最多1000个请求。

限流不一定只是指限速请求。例如,存储服务可能还需要对带宽进行节流,而付费数据服务可能希望对访问的特定数量的记录进行节流。

 (1)如何确定限流

与权限和身份验证一样,REST框架中的限流总是定义为一组类。

在运行视图主体之前,会检查列表中的每个限流器。如果任何节流检查失败,则异常。Throttled异常将被引发,并且视图的主体将不会运行。

(2)设置限流策略

默认的节流策略可以全局设置,使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES设置。

例如:

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ['rest_framework.throttling.AnonRateThrottle','rest_framework.throttling.UserRateThrottle'],'DEFAULT_THROTTLE_RATES': {'anon': '100/day','user': '1000/day'}
}

DEFAULT_THROTTLE_RATES中使用的速率描述可以包括second、minute、hour或day作为节流周期。

您还可以使用基于APIView类的视图,在每个视图或每个视图集的基础上设置节流策略。

from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIViewclass ExampleView(APIView):throttle_classes = [UserRateThrottle]

如果你使用基于装饰器@api_view的函数视图,你可以使用如下装饰器:

@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view(request, format=None):content = {'status': 'request was permitted'}return Response(content)

(3)内置节流器

AnonRateThrottle

AnonRateThrottle只会限制未经认证的用户。传入请求的IP地址用于生成一个惟一的密钥来节流。

允许的请求率由以下其中一个决定(按优先顺序)。

  • 类上的rate属性,可以通过重写AnonRateThrottle并设置该属性来提供。
  • DEFAULT_THROTTLE_RATES['anon']设置

如果你想限制来自未知来源的请求的速率,AnonRateThrottle是合适的。

UserRateThrottle

UserRateThrottle将限制用户在API中给定的请求速率。用户id用于生成一个唯一的节流键。未经身份验证的请求将退回到使用传入请求的IP地址生成一个惟一的密钥来节流。

允许的请求率由以下其中一个决定(按优先顺序)。

  • 类上的rate属性,可以通过重写UserRateThrottle并设置该属性来提供。
  • DEFAULT_THROTTLE_RATES['user']设置

一个API可以同时有多个usererratethrottles。为此,重写UserRateThrottle并为每个类设置一个惟一的“作用域”。

例如:多个用户节流率可以通过使用以下类来实现…

class BurstRateThrottle(UserRateThrottle):scope = 'burst'class SustainedRateThrottle(UserRateThrottle):scope = 'sustained'

然后设置如下

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ['example.throttles.BurstRateThrottle','example.throttles.SustainedRateThrottle'],'DEFAULT_THROTTLE_RATES': {'burst': '60/min','sustained': '1000/day'}
}

如果您希望对每个用户进行简单的全局速率限制,那么UserRateThrottle是合适的。

 

ScopedRateThrottle

ScopedRateThrottle类可用于限制对API特定部分的访问。这个节流阀仅在被访问的视图包含.throttle_scope属性时才会被应用。

通过将请求的“范围”与唯一的用户id或IP地址连接起来,将形成唯一的油门键。

允许的请求速率由DEFAULT_THROTTLE_RATES设置决定,该设置使用来自请求“作用域”的一个键。

例如,给出以下视图

class ContactListView(APIView):throttle_scope = 'contacts'...class ContactDetailView(APIView):throttle_scope = 'contacts'...class UploadView(APIView):throttle_scope = 'uploads'...

然后设置如下:

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ['rest_framework.throttling.ScopedRateThrottle',],'DEFAULT_THROTTLE_RATES': {'contacts': '1000/day','uploads': '20/day'}
}

用户对ContactListView或ContactDetailView的请求将被限制为每天1000个请求。用户对UploadView的请求将被限制为每天20次。

相关内容

热门资讯

安卓系统安装小学教材,安卓系统... 你有没有想过,手机里的安卓系统竟然能装上小学教材呢?没错,你没听错!在这个信息爆炸的时代,科技的发展...
华为安卓系统锁住了,揭秘锁屏背... 最近是不是发现你的华为手机有点儿“顽皮”了?它突然间变得神秘起来,屏幕上那个熟悉的安卓系统仿佛被施了...
安卓电脑改苹果系统,跨越平台的... 你有没有想过,把你的安卓电脑改头换面,变成一个优雅的苹果系统使用者呢?想象那流畅的界面,那独特的触控...
安卓系统怎么按后台,并在任务完... 你有没有遇到过这种情况:手机屏幕一黑,安卓系统就自动进入后台了?是不是觉得有点小郁闷,想要手动切换回...
2021年安卓系统ui,202... 你有没有发现,手机界面最近好像换了个模样?没错,2021年的安卓系统UI可是来了一场大变身呢!今天,...
安卓系统程序编写软件,打造个性... 你有没有想过,手机里的那些神奇应用是怎么诞生的呢?没错,就是那些让你在闲暇时光刷刷视频、在通勤路上玩...
自动开机安卓系统,智能生活新篇... 你有没有想过,当你的安卓手机在清晨的第一缕阳光照耀下自动开机,那种轻松自在的感觉?想象不用再手动解锁...
真我平板x安卓系统,畅享智能生... 亲爱的读者们,你是否也在寻找一款既能满足你对平板电脑的期待,又能让你畅享安卓系统带来的无限乐趣的设备...
恒星安卓系统官网,引领未来智能... 亲爱的读者们,你是否曾好奇过那些闪耀在夜空中的星星,它们是如何在浩瀚的宇宙中熠熠生辉的呢?今天,我要...
u8安卓系统,功能与特色深度解... 你知道吗?在手机操作系统界,有一个小家伙可是相当受欢迎的,它就是U8安卓系统。今天,就让我带你来一探...
花椒安卓系统美颜功能,打造完美... 你有没有发现,现在拍照已经不仅仅是记录生活的工具了,它更是一种艺术创作呢!而在这其中,花椒安卓系统的...
戴尔平板升级安卓系统,畅享安卓... 你有没有发现,戴尔平板最近好像悄悄地来了一次大变身?没错,就是那个我们熟悉的戴尔平板,它现在竟然可以...
安卓助手怎么升级系统,畅享最新... 亲爱的安卓用户们,你是否也和我一样,对安卓系统的升级充满了期待和好奇呢?每次系统升级,都仿佛是给我们...
国产安卓系统的发展,国产安卓系... 你知道吗?在我国科技飞速发展的今天,国产安卓系统可是越来越受到大家的关注呢!它就像一颗冉冉升起的新星...
安卓系统咱们导出电话,轻松备份... 你有没有想过,你的安卓手机里藏着多少珍贵的回忆和重要信息?今天,就让我带你一起探索如何将安卓系统中的...
安卓系统架构设置,构建高效移动... 你有没有想过,你的安卓手机里那些复杂的设置背后,其实隐藏着一个个精心设计的秘密?今天,就让我带你一探...
刷原生安卓系统教程,从入门到精... 亲爱的读者们,你是否对安卓系统充满了好奇,想要亲自体验一下原生安卓的魅力呢?别急,今天我就要手把手教...
原生安卓进入不了系统,系统故障... 最近是不是有不少小伙伴遇到了这样的烦恼:明明手机是原生安卓系统,怎么就进不了系统了呢?别急,今天就来...
安卓子系统开启条件,开启条件全... 你有没有想过,为什么你的安卓手机有时候会突然变得超级流畅,有时候又像是蜗牛爬行?这背后其实有个神秘的...
安卓改苹果系统像素,像素转换的... 你知道吗?最近身边的朋友都在议论纷纷,说他们把安卓手机改成了苹果系统,像素效果简直惊艳到不行!这不,...