Django 之 restframework 频率组件的使用
Django 之 restframework 频率组件的使用以及源码分析
频率组件的使用
第一步,先写一个频率类,继承SimpleRateThrottle
- 一定要在这个类里面配置一个scop=‘字符串’--->字符串用于settings里面配置频率组件
- 在该类里面重写 get_cache_key, 返回self.get_ident(request)
from rest_framework.throttling import SimpleRateThrottle
# 创建一个频率类
class Throttle(SimpleRateThrottle):
# 在频率类中配置一个scope
scope='qzk'
# 重写 该类中的 get_cache_key 方法
def get_cache_key(self,request,view):
# 返回 self.get_ident(request)
return self.get_ident(request)
第二步,在settings.py文件中配置 频率组件
# 全局使用认证、权限组件、频率组件
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.auths.MyAuth", ], # 全局认证组件配置
"DEFAULT_PERMISSION_CLASSES": ["app01.permissions.MyPermission", ], # 全局权限组件配置
'DEFAULT_THROTTLE_CLASSES': ['app01.throttles.RateThrottle', ], # 频率组件全局配置
'DEFAULT_THROTTLE_RATES': {
'qzk': '3/m' # 控制访问频率为一分钟三次
} #
}第三步,在视图类中使用频率组件
- 局部使用:在视图类中,配置 throttle_classes=[RateThrottle,]
from rest_framework.views import APIView
from rest_framework.response import Response
from app01 import models
from app01.myser import BookSerializer # 导入序列化组件
from app01 import auths # 导入认证组件
from app01 import throttles # 导入频率组件
from app01 import permissions # 导入权限组件 class Book(APIView):
"""局部使用三个认证、权限、频率"""
# 配置认证类列表
authentication_classes = [auths.MyAuth, ]
# 配置权限类列表
permission_classes = [permissions.MyPermission, ]
# 配置评率认证列表
throttle_classes = [throttles.RateThrottle, ] # get 获取所有书籍信息
def get(self, request, id):
response = {'status': 100, 'msg': '成功'}
print(id)
if not id:
book_list = models.Book.objects.all()
# 第一个参数是要序列化的queryset对象,如果要序列化多条,必须制定many=True
# 当instance形参被传入的实参是单个参数的时候,many=False
book_serializer = BookSerializer(book_list, many=True)
else:
print(id)
book_obj = models.Book.objects.filter(pk=id).first()
book_serializer = BookSerializer(book_obj, many=False)
print(book_serializer.data)
response['books'] = book_serializer.data
return Response(response) """新增功能"""
def post(self, request, id):
response = {'status': 100, 'msg': '成功'}
# 提交的字典
book = request.data
# 传统方法,创建对象保存
print(book) # 新方法,通过序列化组件保存,必须继承自ModelSerializer
book_ser = BookSerializer(data=book)
# is_valid 提交的字段校验通过
if book_ser.is_valid():
book_ser.save()
response['book'] = book_ser.data
else:
response['msg'] = book_ser.errors # errors 是序列化类 中的钩子函数 raise来的报错信息
return Response(response) """修改功能"""
def put(self, request, id):
response = {'status': 100, 'msg': '修改成功'}
if id: # 提交的字典
book = request.data
# 传统方法,创建对象保存
print(book)
book_obj = models.Book.objects.filter(pk=id).first() # 新方法,通过序列化组件保存,必须继承自ModelSerializer
book_ser = BookSerializer(data=book, instance=book_obj)
# is_valid 提交的字段校验通过
if book_ser.is_valid():
# 这里save()做修改
book_ser.save()
response['book'] = book_ser.data
else:
response['msg'] = book_ser.errors
else:
response['msg'] = '修改对象不存在'
return Response(response) """删除功能"""
def delete(self, request, id):
models.Book.objects.filter(pk=id).delete()
response = {'status': 100, 'msg': '删除成功'}
return Response(response) from django.core.exceptions import ObjectDoesNotExist
import uuid """用户登录类"""
class Login(APIView):
# 局部禁用认证组件
authentication_classes = []
# 局部禁用权限组件
permission_classes = []
# 局部禁用频率组件
throttle_classes = [] def post(self, request):
response = {'code': 100, 'msg': '登录成功'}
name = request.data.get('name')
pwd = request.data.get('pwd')
print(name, pwd)
try:
# get()方法,获取 有且只有一条的 才不报错,其他情况都抛异常
ret = models.User.objects.filter(name=name, pwd=pwd).get() # 登录成功后要去token 表中去存数据
# 表里有 数据或没有数据
# 1. 先生成随机字符串 用uuid
token = uuid.uuid4()
# 2. 存入token表
# update_or_create() 方法 先查后改,查到就修改,没查到就新增 根据 user 去查
models.Token.objects.update_or_create(user=ret, defaults={'token': token})
response['token'] = token
except ObjectDoesNotExist as exc:
response['code'] = 101
response['msg'] = '用户名或密码错误'
except Exception as e:
response['code'] = 102
response['msg'] = str(e)
return Response(response)- 全局使用:在settings文件中配置 DEFAULT_THROTTLE_CLASSES
# 全局使用认证、权限组件、频率组件
REST_FRAMEWORK = {
# 全局认证组件配置
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.auths.MyAuth", ],
# 全局权限组件配置
"DEFAULT_PERMISSION_CLASSES": ["app01.permissions.MyPermission", ],
# 频率组件全局配置
'DEFAULT_THROTTLE_CLASSES': ['app01.throttles.RateThrottle', ],
# 控制访问频率为一分钟三次
'DEFAULT_THROTTLE_RATES': {
'qzk': '3/m' # 这里的'qzk' 是根据频率校验类中的scope决定的,两者保持一致
} #
}
- 局部禁用:在需要禁用的视图类中 将配置的throttle_classes = [ ] 置空
class Book(APIView):
"""局部使用三个认证、权限、频率"""
# 局部禁用认证校验组件
authentication_classes = []
# 局部禁用权限校验组件
permission_classes = []
# 局部禁用频率校验组件
throttle_classes = []
补充models.py
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
publish_time = models.DateTimeField(auto_now_add=True) # 自动添加创建时间
authors = models.ManyToManyField('Author')
publish = models.ForeignKey('Publish') # 一对多
def test(self):
return self.title + '>>' + str(self.price)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
authordetail = models.OneToOneField('AuthorDetail')
class AuthorDetail(models.Model):
tel_num = models.BigIntegerField()
addr = models.CharField(max_length=32)
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
email = models.EmailField()
class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
user_type = models.IntegerField(choices=((1, '超级用户'), (2, '普通用户'), (3, '游客')),default=3)
class Token(models.Model):
user = models.OneToOneField(to='User')
token = models.CharField(max_length=64)
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/(?P<id>\d*)',views.Book.as_view()),
url(r'^login/',views.Login.as_view())
]
Django 之 restframework 频率组件的使用的更多相关文章
- rest-framework频率组件、url注册器、响应器、分页器
频率组件 import time from rest_framework.throttling import BaseThrottle,SimpleRateThrottle IP_DICT = {} ...
- rest-framework频率组件
throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} c ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- Django的rest_framework的权限组件和频率组件源码分析
前言: Django的rest_framework一共有三大组件,分别为认证组件:perform_authentication,权限组件:check_permissions,频率组件:check_th ...
- 基于Django的Rest Framework框架的频率组件
0|1一.频率组件的作用 在我们平常浏览网站的时候会发现,一个功能你点击很多次后,系统会让你休息会在点击,这其实就是频率控制,主要作用是限制你在一定时间内提交请求的次数,减少服务器的压力. modle ...
- Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)
一.认证组件 使用方法: ①写一个认证类,新建文件:my_examine.py # 导入需要继承的基类BaseAuthentication from rest_framework.authentica ...
- Django day28 频率组件,解析器
一:频率组件: 1.频率是什么? 节流,访问控制 2. (1)内置的访问频率控制类SimpleRateThrottle (2)写一个类,继承SimpleRateThrottle class MyThr ...
- Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析
认证组件 权限组件 频率组件
- RestFramework之频率组件
一.频率组件的使用 频率组件的存在对我们这web开发有着很大的影像,它的作用就是限制用户在一段时间内访问的次数. 下面让我们介绍一下频率组件怎样使用 1.首先需要导入 from rest_framew ...
随机推荐
- 第01组 Alpha事后诸葛亮
目录 一.总结思考 1.设想和目标 ①我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ②我们达到目标了么(原计划的功能做到了几个? 按照原计划交付时间交付了么? 原 ...
- Java 并发系列之一:java 并发体系
1. java 并发机制的底层原理实现 1.1 volatile 1.2 synchronized 1.3 原子操作 2. java 内存模型(JMM) 3. java并发基础线程 4. java ...
- 正方教务系统客户端 error loading midas.dll.
在windows xp/7/10上安装了客户端,安装到注册字体一步,没有响应,强行结束.启动客户端,登录,出现 error loading midas.dll. 32位:先将 midas.dll 放 ...
- Java一个对象占用多少字节
虚拟机:Java HotSpot(TM) 64-Bit Server VM (25.221-b11, mixed mode) 对象的内存以字节为单位,且必须是8的倍数,它的构成由3部分组成:对象头+实 ...
- 在 flutter 上使用 c 代码 - (一) 有源码的项目
在 flutter 的 1.10.x 后的分支, dart:ffi 被并入 flutter, 现在 flutter 中也可以使用 ffi 了. 这东西是啥玩意呢, 就是让 dart 可以直接调用 c/ ...
- Visual Studio pro key license 2019
仅供学习交流使用,勿用作其他用途!!!! Visual Studio 2019 Enterprise BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 201 ...
- dotnet core 之 CORS使用示例
这里列举几个经过验证的可用的CORS使用示例, 方便在需要的时候可以直接使用 示例1 #region snippet2 public void ConfigureServices(IServiceCo ...
- WindowsXP序列号产生原理(椭圆曲线法)
WindowsXP序列号产生原理(椭圆曲线法) 来源 https://blog.csdn.net/zhiyuan411/article/details/5156330 参考 https://www. ...
- Java自学-接口与继承 对象转型
Java中的对象转型 示例 1 : 明确引用类型与对象类型的概念 首先,明确引用类型与对象类型的概念 在这个例子里,有一个对象 new ADHero(), 同时也有一个引用ad 对象是有类型的, 是A ...
- kylin2.4.1订单案例详细构建流程
一.Hive订单数据仓库构建: hive表创建可以在命令行中直接完成,也可以在Hue中完成,本文在Hue中的完成,如下图: 下文的样例文本文件下载地址:https://files-cdn.cnblog ...