Django-restframework23 Throttling

2023-10-20 07:32

本文主要是介绍Django-restframework23 Throttling,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    • ThrottlingTwitter API rate limiting response
      • 简介
      • 如何设置节流类
      • 设置节流策略
      • 怎样识别客户
      • 设置缓存cache
    • 接口使用指南
    • 自定义节流阀

HTTP/1.1 420让你更冷静

1 Throttling(Twitter API rate limiting response)

1. 简介

节流(Throttling)类似于权限,因为它决定了是否应该对请求进行授权。节流表示一个临时状态,并用于控制客户端对API的请求率。
与许可一样,可以使用多个节流。对于未经身份验证的请求,您的API可能会有一个限制节流阀,而对于经过身份验证的请求,则会有一个更小的节流阀。
另一个可能需要使用多个节流的场景是,如果您需要对API的不同部分施加不同的约束,因为某些服务特别占用资源。
如果您想要同时强制实施节流率和持续的节流率,那么多节流也可以使用。例如,您可能希望将用户限制为每分钟60次请求,每天1000次请求。
节流不一定只涉及到速率限制的请求。例如,存储服务可能还需要对带宽进行节流,而付费数据服务可能希望对访问的某些记录进行节流。

2. 如何设置节流类

和permissions,authentication一样,throttling也被定义成类的列表
在运行每一个主体部分之前,将会检查每一个 throttle。如果检查失败,抛出exceptions.Throttled,主体部分不在运行。

3. 设置节流策略

全局默认值使用DEFAULT_THROTTLE_CLASSES和DEFAULT_THROTTLE_RATES设置

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.AnonRateThrottle','rest_framework.throttling.UserRateThrottle'),'DEFAULT_THROTTLE_RATES': {'anon': '100/day','user': '1000/day'}
}

对于速率的描述包括second, minute, hour或者day,也可以在使用APIView的视图中设置基于类的节流

from rest_framework.response import Response
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIViewclass ExampleView(APIView):throttle_classes = (UserRateThrottle,)def get(self, request, format=None):content = {'status': 'request was permitted'}return Response(content)@api_view(['GET'])
@throttle_classes([UserRateThrottle])
def example_view(request, format=None):content = {'status': 'request was permitted'}return Response(content)

4. 怎样识别客户

使用X-Forwarded-For和Remote-Addr(X-Forwarded-For:请求端真实IP)
https://imququ.com/post/x-forwarded-for-header-in-http.html
X-Forwarded-For: client, proxy1, proxy2 (用户真实地址,代理1,代理2)(三级代理,代理3直接连接服务器,所以不显示在XXF中, Remote-Addr=代理3,除了直连IP没有一个可以信任)
HTTP请求头,作为用户的唯一性认证。优先使用X-Forwarded-For,没有再使用Remote-Addr。
如果您需要严格地识别唯一的客户端IP地址,那么您需要首先配置这个API所支持的应用程序代理的数量(NUM_PROXIES设置)。如果将其设置为非0整数。一旦任何用户代理被移除,用户的真实地址就是X-Forwarded-For中的最后一个IP.如果设置为0。将会一直使用Remote-Addr请求头最为唯一性验证信息。

5. 设置缓存(cache)

throttle_classes由django的 cache后端提供。必须设置合适的cache。默认值为LocMemCache。

# 修改默认值
class CustomAnonRateThrottle(AnonRateThrottle):cache = get_cache('alternate')

设置全局默认值(’DEFAULT_THROTTLE_CLASSES’),或者在throttle_classes中的属性设置。

2 接口使用指南

  1. AnonRateThrottle
    设置匿名用户的访问频率,AnonRateThrottle类中有一个rate属性,可以通过设置中的DEFAULT_THROTTLE_RATES[‘anon’]设置。
  2. UserRateThrottle
    认证用户访问频率,通过DEFAULT_THROTTLE_RATES[‘user’]设置,一个接口可以有多个UserRateThrottles,此时就需要继承重写UserRateThrottle的scope属性。
class BurstRateThrottle(UserRateThrottle):scope = 'burst'class SustainedRateThrottle(UserRateThrottle):scope = 'sustained'REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('example.throttles.BurstRateThrottle','example.throttles.SustainedRateThrottle'),'DEFAULT_THROTTLE_RATES': {'burst': '60/min','sustained': '1000/day'}
}
  1. ScopedRateThrottle
    可以用来约束API不同的部分。仅仅用在包含.throttle_scope属性的视图中,通过将用户的ID或者IP与唯一的‘scope’属性链接起来。
# views中
class ContactListView(APIView):throttle_scope = 'contacts'...class ContactDetailView(APIView):throttle_scope = 'contacts'...class UploadView(APIView):throttle_scope = 'uploads'# 设置文件中
REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.ScopedRateThrottle',),'DEFAULT_THROTTLE_RATES': {'contacts': '1000/day','uploads': '20/day'}
}

3 自定义节流阀

  • 继承重写BaseThrottle
  • 实现.allow_request(self, request, view)方法,如果请求允许返回True
  • 可选:.wait()方法,返回下一次请求需要等待的时间(seconds)或者None.wait()只有在.allow_request()预先返回了False,才会被调用。如果设置了.wait()方法,Retry-After将会被包含在响应头中。
import randomclass RandomRateThrottle(throttling.BaseThrottle):def allow_request(self, request, view):return random.randint(1, 10) != 1

这篇关于Django-restframework23 Throttling的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245646

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

Linux搭建Python3、Django环境

开发十年,就只剩下这套架构体系了! >>>    好久没写了,朋友们,我又回来了。 安装Python3 Python全部版本下载地址:         https://www.python.org/ftp/ 解决RedHat,使用Python3退格出现乱码问题:         yum -y install readline-devel.x86_64 下载Python3:

Django 第十七课 -- 视图 - FBV 与 CBV

目录 一. 前言 二. FBV 三. CBV 一. 前言 FBV(function base views) 基于函数的视图,就是在视图里使用函数处理请求。 CBV(class base views) 基于类的视图,就是在视图里使用类处理请求。 二. FBV 基于函数的视图其实我们前面章节一直在使用,就是使用了函数来处理用户的请求,查看以下实例: 路由配置: urlpat

django摄影竞赛小程序论文源码调试讲解

2系统关键技术及工具简介 系统开发过程中设计的关键技术是系统的核心,而开发工具则会影响的项目开发的进程和效率。第二部分便描述了系统的设计与实现等相关开发工具。 2.1 Python简介 Python 属于一个高层次的脚本语言,以解释性,编译性,互动性和面向对象相结合。在设计上相比其他语言,它更具有特色语法结构,很强的可读性。 2.2 Django框架 Django是一个开放源

Django 测试指南

#Django 测试指南 对绝大部分人来说,测试Django应用感觉很神秘,他们只是听说代码必须要测试,但是经常找不到线索如何入手。当他们看了Django的测试文档,他们找到深入的哪些功能是可用的,但是如果实现没有任何指导。 这是本博客系列的第一篇,尝试帮助大家减轻压力,使得每个人在测试潮流。假设你从来没有做过任何测试,但是对Python&Django很熟悉了。 我们将贯穿添加测试到pere

使用django-simple-captcha遇到的坑

使用django-simple-captcha遇到的坑 一站点gongshare.com在做注册功能时验证码采用的django-simple-captcha,因为笔者开发环境采用的Windows 64bit系统,结果安装使用的时候接二连三遇到好几个坑。 django-simple-captcha需要依赖django1.3+、PIL1.1.7+或者Pillow2.0+,根据文档安装后开始使用时,

解决Django会话中的竞态条件

Django 会话中的竞态条件(race condition)问题通常发生在多个请求几乎同时修改同一个会话数据时,导致数据丢失或数据不一致。这种情况在需要频繁更新会话数据的场景(如实时聊天应用、并发请求处理等)中尤为常见。 1、问题背景 在 Django 中使用会话时,可能会遇到竞态条件,导致数据丢失或不一致。竞态条件是指两个或多个请求同时访问共享资源时,由于执行顺序的不确定性,导致数据不

Django+Vue3前后端分离学习(五)(前端登录页面搭建)

1、如果需要使用组合式API,需要安装插件: npm install vite-plugin-vue-setup-extend --save-dev 在vite.config.js里配置: 首先导入: import VueSetupExtend from 'vite-plugin-vue-setup-extend' 添加: 2、创建login.vue 然后再index.js里添加

Python——在Linux和Windows下创建Django项目

前言:我和一个室友合作写了一个网站,“网络数据库技术”的课程 project。 从2016年4月8日开始,到2016年4月29日发布第一个版本,在这三个星期的时间里面,前一半时间用来学习Python,Django和Git/GitHub,后一半时间现学现卖,真正在写网站。期间充满了对于未知的探索,在短时间内增加了很多新技能,对整个互联网有了更深的认识。 这个 web project 发布在G