169. 基于Django-RESTFramework的节流的使用

news2025/7/9 1:48:40

1.节流概述

节流又称限流,限制访问。
就是一个用户多次发送一个请求(页面或者链接)的时候,单位时间允许访问次数限制,超过限制就会出现访问受限,提示譬如:离下一场访问还有多久之类等的字样。

2.自定义节流

说明

  • 两个类,都继承SimpleRateThrottle类,因为该类实现了很多通用的节流功能
  • 都必须实现get_cache_key方法,返回该类用于节流的key(需要确保能够区分每个请求用户),
    • AnonymousThrottle的get_cache_key:获取的请求的IP
    • UserThrottle的get_cache_key:登录用户的用户名
  • scopre: 节流配置的key,用于在配置中对应DEFAULT_THROTTLE_RATES的配置
  • cache:默认使用django项目配置的default缓存保存客户端识别的信息,如果没有配置就保存在内存中
  • 都是通过SimpleRateThorttle类的allow_request(self,request,view)方法做的限制,可以自定义方法进行覆盖,该方法返回boolean值
    创建py文件
# rest_app/app_throttles.py 节流的使用
from rest_framework.throttling import SimpleRateThrottle

class AnonymousThrottle(SimpleRateThrottle):
    # 如果有配置了多个缓存,默认使用'default',可以通过cache属性指定
    # cache = caches['alternate']
    scope = 'annonymous'
    def get_cache_key(self, request, view):
        return self.get_ident(request)# 获取ip
    

class UserThrottle(SimpleRateThrottle):
    scope = 'user'
    def get_cache_key(self, request, view):
        return request.user.username # 获取用户名

settings.py

REST_FRAMEWORK = {
    # 自定义节流类
    "DEFAULT_THROTTLE_CLASSES":["rest_app.app_throttles.UserThrottle"],# 配置默认的节流类,列表,路由配置多个
    # 节流频率的规则,字典,key时第一步中节流类的scope属性,值是5/m
    "DEFAULT_THROTTLE_RATES": {
        "anonymous": '5/m',# 名称:次数/单位时间
        "user": '10/m',
   }
}

在这里插入图片描述
对视图指定节流类

class StudentsView(generics.ListCreateAPIView):
    # 指定需要操作的数据与序列化类
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    # 添加身份验证功能
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    # 标识匿名用户访问
    throttle_classes = [app_throttles.AnonymousThrottle]
    
    # 重写新增方法,在保存Student时候关联用户
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
         

在这里插入图片描述
针对视图函数的创建,也可以使用装饰器的方式进行标识

3.内置节流类

urls

REST_FRAMEWORK = {
    # 默认的验证是按照验证列表 从上到下 的验证
    'DEFAULT_AUTHENTICATION_CLASSES': (
    # 配置JWT认证
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    # 配置session_id认证
    'rest_framework.authentication.SessionAuthentication',
    # 配置默认的认证方式 base:账号密码验证
    'rest_framework.authentication.BasicAuthentication',
   ),

#     # 自定义节流类
#     "DEFAULT_THROTTLE_CLASSES":["rest_app.app_throttles.UserThrottle"],# 配置默认的节流类,列表,路由配置多个
#     # 节流频率的规则,字典,key时第一步中节流类的scope属性,值是5/m
#     "DEFAULT_THROTTLE_RATES": {
#         "anonymous": '5/m',# 名称:次数/单位时间
#         "user": '10/m',
#    },

     #默认节流类
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
        
   ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/m', # 未经授权的角色anon
        'user': '5/m', # 已授权就是user
   },

views中记得注释标识匿名用户访问的代码
说明
rest_framework.throttling下,除了有SimpleRateThrottle这个简单的节流类外,还有三个内置的类:

  1. AnonRateThrottle:处理未经授权的用户,请求的IP地址用于生成用于限制的唯一键
  2. UserRateThrottle:处理授权的用户,用户标识用于生成要限制的唯一键。未经身份验证的请求将会退到使用传入请求的IP地址生成一个唯一的密钥来限制
  3. ScopedRateThrottle:当正在访问的视图包含throttle_scope属性时,才会应用此限制

4.指定视图节流

urls

REST_FRAMEWORK = {
    # 默认的验证是按照验证列表 从上到下 的验证
    'DEFAULT_AUTHENTICATION_CLASSES': (
    # 配置JWT认证
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    # 配置session_id认证
    'rest_framework.authentication.SessionAuthentication',
    # 配置默认的认证方式 base:账号密码验证
    'rest_framework.authentication.BasicAuthentication',
   ),

#     # 自定义节流类
#     "DEFAULT_THROTTLE_CLASSES":["rest_app.app_throttles.UserThrottle"],# 配置默认的节流类,列表,路由配置多个
#     # 节流频率的规则,字典,key时第一步中节流类的scope属性,值是5/m
#     "DEFAULT_THROTTLE_RATES": {
#         "anonymous": '5/m',# 名称:次数/单位时间
#         "user": '10/m',
#    },

#      #默认节流类
#     'DEFAULT_THROTTLE_CLASSES': [
#         'rest_framework.throttling.AnonRateThrottle',
#         'rest_framework.throttling.UserRateThrottle',
        
#    ],
#     'DEFAULT_THROTTLE_RATES': {
#         'anon': '3/m', # 未经授权的角色anon
#         'user': '5/m', # 已授权就是user
#    },
    
    #指定视图节流
    'DEFAULT_THROTTLE_CLASSES':[
        'rest_framework.throttling.ScopedRateThrottle',
        ],
    'DEFAULT_THROTTLE_RATES': {
        'students': '10/m',
        'uploads': '20/day',
   }
}

views

# 优化代码:
class StudentsView(generics.ListCreateAPIView):
    # 指定需要操作的数据与序列化类
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    # 添加身份验证功能
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    # 指定视图节流类
    throttle_scope = "students"
    
    # 重写新增方法,在保存Student时候关联用户
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的学生考勤管理系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【学习笔记】顺序容器的表格方式总结 C++

目录顺序容器及其特点顺序容器操作向顺序容器添加元素insertemplace参考更新中… 顺序容器及其特点 名字访问元素插入,删除元素vector(可变大小数组)支持快速随机访问在尾部之外的位置插入或删除元素可能很慢deque(双端队列&…

SpringBoot实战:整合MapStruct实现数据类型转化

MapStruct 是一个代码生成器,它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现。自动生成的映射转换代码只使用简单的方法调用,因此速度快、类型安全而且易于理解阅读;本篇就是实现 SpringBoot 整合 MapStruct 实现数据类型…

[附源码]JAVA毕业设计小区物业管理系统演示录像2020(系统+LW)

[附源码]JAVA毕业设计小区物业管理系统演示录像2020(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09…

ffmpeg库安装及入门指南(Windows篇)- 2022年底钜献

最近项目需要,使用了 ffmpeg 做摄像头视频采集和串流。这几天有点时间,打算把相关的一些知识记录分享一下。 在撰写本文时,我又在另外一台电脑上把 ffmpeg 重新安装了一遍,所以绝对真实靠谱!如果你觉得文章写得还不错…

代码效果测试

ROBUST TEXT DETECTION IN NATURAL IMAGES WITH EDGE ENHANCED MAXIMALLY STABLE EXTREMAL REGIONS 代码地址:https://github.com/akab/TextDetection 基本步骤: 1)将原图转为灰度图; 2)使用OpenCV的canny函数进行边…

HTML -- 常用标签及示例总结

文章目录HTML常用标签1 标签语义1.1 标签属性2 标题标签 h1 - h63 段落和换行标签3.1 段落标签3.2 换行标签4 文本格式化标签5 div和span6 图像标签7 超链接标签7.1 链接的语法格式7.2 链接分类8 表格标签8.1 表格的主要作用8.2 表格的基本语法8.3 表头单元格标签8.4 表格属性8…

C语言随机数的产生(rand、srand、time函数细节讲解)

✨C语言随机数的产生随机数生成代码&#xff1a;rand函数&#xff1a;srand函数&#xff1a;time函数&#xff1a;time函数补充:time_t类型讨论time_t指针传入的讨论&#xff1a;随机数生成代码&#xff1a; 先上代码&#xff0c;再详细解释&#xff1a; #include<stdio.h…

Python数组数据处理办法清单

import numpy as np import pandas as pd import matplotlib.pyplot as plt#matplotlib 的字体&#xff08;font&#xff09;为黑体&#xff08;SimHei&#xff09; plt.rcParams[font.sans-serif] [SimHei, ] # matplotlib正确显示正负号 plt.rcParams[axes.unicode_minus] …

dfs序(树形结构线性化)

dfs序是将树形结构转换为线性结构的一种方式。 dfs序 dfs序&#xff1a; 指每个节点在dfs深度优先遍历中的进出栈的时间序列。 定义三个数组&#xff1a; in[x]&#xff1a;表示结点x 入栈的时间戳。 out[x]&#xff1a;表示结点x出栈的时间戳&#xff0c;特殊的&#xff0c;出…

Linux网络原理及编程(5)——第十五节 TCP的连接(三次握手、四次挥手)

目录 三次握手 四次挥手 我们来重点说说两个状态&#xff1a;CLOSE_WAIT和TIME_WAIT 【CLOSE_WAIT】 【TIME_WAIT】 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主w…

Linux CENTOS安装mysql8 64位

1. 查看系统中是否已经安装了mariadb 执行&#xff1a;yum list installed | grep mariadb 若已经存在&#xff0c;则删除 执行&#xff1a; yum remove mariadb 2.下载需要安装的压缩文件&#xff0c;从官网下载&#xff0c;文件为名字为 mysql-8.0.31-linux-glibc2.12-x86_6…

S7-1200和1500PLC与条码枪建立TCP_IP通信的具体方法示例

S7-1200和1500PLC与条码枪建立TCP_IP通信的具体方法示例 今天和大家分享西门子S7-1200和1500PLC如何获取条码枪的扫描数据,这种案例中一般PLC作为TCP/IP的客户端(只接收数据,不发送数据),条码枪作为TCP/IP的服务器。 如下图所示,在指令—通信—开放式用户通信中可以找到相关…

洞察 | 软件定义汽车时代下,汽车制造产业的应对策略

汽车产业作为先进制造行业&#xff0c;伴随着数字化技术&#xff0c;电气化技术的迭代正快速的成长&#xff0c;而随着智能汽车、自动驾驶概念的提出&#xff0c;整车制造的软硬件复杂度也在持续提升&#xff0c;软件定义汽车转型已成整体汽车制造产业的共识。 据中国软件行业…

成长任务| 挑战代码画颗圣诞树

&#x1f384;立即投稿&#x1f384; &#x1f4cc;活动规则 圣诞将至&#xff0c;这次来试试用代码过圣诞吧~挑战圣诞树的一万种画法! √ 使用代码画一颗#圣诞树#&#xff0c;将你的代码文件通过本页面投稿&#xff0c;审核通过即可参与活动 √ 可使用任意编程语言&#xff…

【解纠缠表示:图像增强】

DRLIE: Flexible Low-Light Image Enhancement via Disentangled Representations &#xff08;DRLIE&#xff1a;基于解纠缠表示的柔性弱光图像增强&#xff09; 解纠缠表示 弱光图像增强&#xff08;Low-light image enhancement (LIME)&#xff09;是将亮度不理想的图像转化…

为了彻底弄懂CSS中的1px究竟有多长,我翻出了家里的卷尺

CSS是描述HTML文档如何显示的&#xff0c;在显示的过程中&#xff0c;HTML元素的长宽、间距、字体大小等等&#xff0c;都需要通过长度尺寸单位来表示。我们常常会说&#xff1a;字体大小16像素&#xff0c; 间距10个像素。这里的像素&#xff0c;就是CSS中的长度尺寸单位。一个…

软件测试行业真的不行了吗?那出路到底在哪?

下面这张图片&#xff0c;想必大家应该都知道~~~ 其实每个人都在金字塔里面&#xff0c;只不过大家的高低位置不同&#xff0c;当然&#xff0c;越在底层的人越多&#xff0c;越在高层的人越少~ 这也符合“二八定律”&#xff0c;“优胜劣汰”&#xff0c;“适者生存”~ 当你的…

c++中的this指针

1.this指针的引入 首先我们看下面这一段代码 class Date { public:void DateSet(int year, int month, int day){_year year;_month month;_day day;}void print(){cout << _year << "-" << _month << "-" << _day <…

论文速递:一种用于视觉定位的基于NLP思路的直线特征匹配算法

标题&#xff1a;Line as a Visual Sentence:Context-aware Line Descriptor for Visual Localization 作者&#xff1a;Sungho Yoon1 and Ayoung Kim2∗ 摘要 在机器人以及计算机视觉领域&#xff0c;除了通过使用图像匹配的特征点计算多视图几何来求解问题&#xff0c;还可…