限流Throttling
可以对接口访问的频次进行限制,以减轻服务器压力
使用
可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES和DEFAULT_THROTTLE_RATES进行全局配置,
# 限流配置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES':(
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
),
'DEFAULT_THROTTLE_RATES':{
'anon':'3/day',
'user':'1000/day'
},
DEFAULT_THROTTLE_RATES可以使用second,minute,hour,或day来指明周期。
过滤
对于列表数据可以需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。
pip install django-filter
在配置文件中增加过滤后端的设置
INSTALLED_APPS = [
'django_filters' , # 需要注册应用
]
REST_FRAMEWORK = {
# 过滤
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
在食图中添加filter_fields属性,指定可以过滤的字段
class UserModelViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSer
pagination_class = StandardPageNumberPagination
filter_backends = (OrderingFilter,DjangoFilterBackend)
filter_fields = ['username','age','home']
ordering_fields = ('age')
# 192.168.56.100:8888/app01/user1/?age=18
排序
对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。
使用方法
在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter 过滤器,REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数照明的排序字段对数据集进行排序。
前段可以传递的ordering参数的可选字段值需要在ordering_fields中照明
示例:
class UserModelViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSer
pagination_class = StandardPageNumberPagination
# 排序
filter_backends = (OrderingFilter,DjangoFilterBackend)
filter_fields = ['username','age','home']
ordering_fields = ('age')
# 192.168.56.100:8888/app01/user1/?ordering=age
PageNumberPagination
前段访问网址形式:
GET http://api.example.org/app01/user1/?page=2
可以在子类中定义的属性:
*page_size每页数目
*page_query_param前段发送的页数关键字名,默认为‘page’
*page_size_query_param前段发送的每页数目关键字名,默认为none
*max_page_size前段最多能设置的每页数量
class StandardPageNumberPagination(PageNumberPagination):
page_size_query_param = 'page_num'
max_page_size = 2
class UserModelViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSer
# 分页
pagination_class = StandardPageNumberPagination
filter_backends = (OrderingFilter,DjangoFilterBackend)
filter_fields = ['username','age','home']
ordering_fields = ('age')
# 192.168.56.100:8888/app01/user1/?page=1&page_num=2