1 频率组件

#自定义组件写频率认证(重点继承BaseThrottle)
from rest_framework.throttling import BaseThrottle
import time
class Thro(BaseThrottle):
dic={}
def allow_request(self, request, view):
'''
:param request:
:param view:
:return: 布尔类型
'''
ctime=time.time()
self.ip=request.META.get('REMOTE_ADDR')
if self.ip and self.ip not in self.dic:
self.dic[self.ip]=[ctime]
return True
lis=self.dic.get(self.ip)
#把最早的时间和现在时间对比 1.大于多少秒(60s)的去掉 2.留下的是多少秒内(60秒内)的时间数 = 访问次数
while lis and ctime-lis[-1]>60:
lis.pop()
#剩下的时间列表 1.在多少秒内(60s内)2.设置访问次数:列表内时间个数=限制范文次数
if len(lis)<6:
lis[:0]=[ctime]
print (self.dic)
return True
print(self.dic)
return False
#访问超过限制触发
def wait(self):
'''
:return:多少秒过后才可以访问
'''
#最早的时间
tim=self.dic.get(self.ip)[-1]
ctime=time.time()
#ctime-tim 值越来越大
return 60-(ctime-tim) #局部使用
throttle_classes=[Thro,]
#全局使用
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.Mythrottle.Thro', ],
}

自定义的频率组件

#settings
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': ['app01.Mythrottle.Thro', ],
'DEFAULT_THROTTLE_RATES': {
#self.scope : self.rate
'keykey': '6/m' #1分钟最大访问次数为6
} } #定义一个频率组件类(重点继承SimpleRateThrottle)
class Thro(SimpleRateThrottle):
scope = 'keykey'
def get_cache_key(self, request, view):
# 返回ip地址
# ip=request.META.get('REMOTE_ADDR')
# return ip
return self.get_ident (request)

内置的频率组件(只需配置一下,再写个类返回ip/可以返回用户名_按需求)

class Books(APIView):
#apiview的方法
# def throttled(self, request, wait):
# """
# If request is throttled, determine what kind of exception to raise.
# """
#源码:实例话了一个对象,我们只需要把这个 数据属性的英文错误改成中文
#中文显示:让后再让我们自定义类的对象调父类的ini方法
# raise exceptions.Throttled (wait)
#改中文
def throttled(self, request, wait):
from rest_framework import exceptions
class sss(exceptions.Throttled):
default_detail = '访问限制'
extra_detail_singular = '{wait}秒解除限制'
extra_detail_plural = 'Expected available in {wait} seconds.'
raise sss(wait)
def get(self,request):
response={'status':100,'msg':'请求成功'}
books=models.Book.objects.all()
ser=Myserializers.Books(books,many=True)
response['data']=ser.data
return JsonResponse(response,safe=False)

限制访问改中文信息

2 解析器

    作用:传过来的数据,解析成字典
使用:
局部使用:
from rest_framework.parsers import JSONParser,FormParser
在视图类中:
parser_classes = [FormParser,]
全局使用
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser'
] } 局部使用指定的解析器:
在视图类中:
parser_classes = [FormParser,]

内置的直接使用

随机推荐

  1. jQuery中获取a标签的值

    如题,一组相同action的a标签,不同的是a标签的内容为搜索内容.点击页面显示不同的数据 刚开始试过在 a标签中添加 value值 和id 的值,结果在jQuery中获取值均失败! 后来发现,根本不 ...

  2. python 单例模式总结

    参考 # 第一种方法 new 方法 class Singleton(object): def __new__(cls,*args,**kw): if not hasattr(cls,'_instanc ...

  3. sqlalchemy数据库分层操作

    在学习sqlalchemy操作中,最常见的就是如下的示例,一个文件基本上包含了数据库的增删改查.sqlalchemy的具体操作我就不再详细说明了.流程大概是: 定义表 创建数据库引擎 创建表 插入数据 ...

  4. 归并排序_JAVA

    import java.util.Arrays; public class Main { public static void main(String[] args) { int[] a = { 6, ...

  5. 解析ArcGis的标注(二)——认识ArcGis标注标签

    该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. 本篇的标注语句解析使用VBScript,注 ...

  6. IIS回收时间设置

    IIS默认回收时1740分钟,这样的话,有可能在访问高峰期时时回收,可以设置为定时回收

  7. moment.js 时间戳转换

    1. 一段时间以0点为标准 : 2018-03-15 00:00:00- 2018-03-21 00:00:00 let startTime = moment('2018-03-15').format ...

  8. git操作本地仓库基本使用教程

    1.创建仓库 mkdir learngit 2.初始化 cd learngit git init 3.添加文件(把要提交的所有修改放到暂存区(Stage)) git  add 文件 4.提交到仓库(以 ...

  9. Windows jdk安装以及版本切换

    Windows jdk版本切换 一.安装 1.下载 官网: Java SE Development Kit 8 Downloads Java SE 7 Archive Downloads 1.7之前的 ...

  10. HashMap的源码,实现原理,底层结构

    转载一遍不错的文章,让你深入了解HashMap http://www.cnblogs.com/ITtangtang/p/3948406.html