Restful API学习Day5 - DRF之限制 分页 解析器和渲染器
参考文档:
Django REST framework基础:认证、权限、限制
Django REST framework基础:分页
Django REST framework基础:解析器和渲染器
一、限制
比如:限制一个IP每10秒钟只能访问3次(Django中间件 访问频率限制)
visit_record = {
'127.0.0.1': ['9:56:18', '9:56:17', '9:56:04', '9:56:01'] # 只放最近10秒的请求时间
}
自定义限制类
visit_record = {}
class MyThrottle(object):
def __init__(self):
self.history = None
def allow_request(self, request, view):
# 拿到当前的请求的ip作为访问记录的 key
ip = request.META.get('REMOTE_ADDR')
# 拿到当前请求的时间戳
now = time.time()
if ip not in visit_record:
visit_record[ip] = []
# 把当前请求的访问记录拿出来保存到一个变量中
history = visit_record[ip]
self.history = history
# 循环访问历史,把超过10秒钟的请求时间去掉
while history and now - history[-1] > 10:
history.pop()
# 此时 history中只保存了最近10秒钟的访问记录
if len(history) >= 3:
return False
else:
# 判断之前有没有访问记录(第一次来)
self.history.insert(0, now)
return True
def wait(self):
"""告诉客户端还需等待多久"""
now = time.time()
return self.history[-1] + 10 - now
如何确定还需要等多久才允许下一次访问:

使用内置的限制类
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
scope = "xxx"
def get_cache_key(self, request, view):
return self.get_ident(request)
全局注册

二、分页
DRF内置分页器(3种)
页码类型
class MyPageNumber(PageNumberPagination):
# page_size = 1 # 每页显示多少条
# page_size_query_param = 'size' # 每页显示多少条的参数key
pass
limit&offset型,数据库查询时效率较高!
自定义:
# 当有特殊的配置需要代替默认的配置时,我们就自己写个类
class MyLimitPager(LimitOffsetPagination):
limit_query_param = 'page_size' # 自定义limit的参数key
pass
http://127.0.0.1:8000/publishers/?offset=1&limit=2
加密的分页
用户 让别人看不到具体的页码,页码都是随机字符串

queryset切片之后不能 order_by()
自定制:
class MyCursor(CursorPagination):
ordering = '-id'
page_size = 1
三、解析器和渲染器

配置
# 解析器
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),
# 渲染器
# 你要页面 我就给你页面
# 你要JSON格式的数据 我就给你JSON格式的数据
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
# 'rest_framework.renderers.BrowsableAPIRenderer',
),
Restful API学习Day5 - DRF之限制 分页 解析器和渲染器的更多相关文章
- Restful API学习Day4 - DRF版本控制和认证
参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...
- Restful API学习Day3 - DRF视图
视图 一.进化 class GenericView(APIView): """把视图中可能用到的配置和方法封装起来""" queryset ...
- RESTful API 学习
/********************************************************************************* * RESTful API 学习 ...
- DRF 版本、认证、权限、限制、解析器和渲染器
目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...
- RESTful API学习Day2 - Django REST framework
Django REST framework 参考文档: 官方文档:官方文档 中文文档:中文文档 一.是什么? 基于Django开发RESTful API的一个框架 为什么要用它? 补充: CBV的 ...
- RESTful API学习与实践
参考文献: 1.Learn About ASP.NET Web API 2.深入浅出REST 3.Infoq上“深入探索REST”系列文章 4.RESTful API设计的一点经验 5.Angular ...
- RESTful API 学习【第1篇】
一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
- DRF频率、分页、解析器、渲染器
DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...
随机推荐
- [luoguU48574][藏妹子之处]
题目链接 思路 首先,因为这是曼哈顿距离,所以很容易就可以将这三个点之间的距离转化为一个矩形,那么这三个点在矩形上的分布只有六种可能. 假设当前矩形的长为n,宽为m.那么可以发现,无论是哪一种情况,这 ...
- Django(十一)请求生命周期之响应内容(请求/响应 头/体)
https://www.cnblogs.com/renpingsheng/p/7534897.html Django请求生命周期之响应内容 http提交数据的方式有"post",& ...
- JS 判断各种设备,各种浏览器
话不多说,直接看代码 1.区分Android.iphone.ipad: var ua = navigator.userAgent.toLowerCase(); if (/android|adr/gi. ...
- Redis和memcached区别须知
1.支持的数据类型不同(memcached只支持简单的key-value的数据类型,Redis支持5种数据类型(1.string,2.list,3.set,4.zset,5.hash)) 2.redi ...
- struts2 OGNL配和通用标签和其它标签的使用
三.OGNL配合通用标签的其他使用 1.iterator标签(很重要) 动作类 package com.itheima.web.action; import java.util.ArrayList; ...
- Day27--Python--初识socket
一. C\S架构, 客户端服务端架构 客户端(client): 享受服务端提供的服务 服务端(server): 给客户端提供服务 B\S 浏览器和服务端 B (browser) 二. 网络通信的整个流 ...
- Unity 物体移动的理解
Unity通过内置的Input类获取外部输入,具体查看: Editor---Project Setting---Input,常见的输入比如:Vertical.Horizontal.Fire1.Jump ...
- makefile解析:一些常用函数
#======================================================================= #指定目标文件名,makefile中的变量直接使用不用 ...
- Vue.js 循环语句
循环使用 v-for 指令. v-for 指令需要以 site in sites 形式的特殊语法, sites 是源数据数组并且 site 是数组元素迭代的别名. v-for 指令: v-for 可以 ...
- B+树及数据库索引的应用
B树 每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null. B+树 只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针. 后来,在B+树上增加了顺 ...