Django REST framework 如何实现内置访问频率控制
作者:little_pd 发布时间:2023-08-01 17:11:00
标签:django,rest,framework,内置,访问,频率,控制
对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
"""匿名用户访问频率限制"""
scope = "AnonymousUser" # 随便写的,可以作为key保存在缓存中
def get_cache_key(self, request, view):
return self.get_ident(request)
class UserThrottle(SimpleRateThrottle):
"""登录用户访问频率限制"""
scope = "LoginUser"
def get_cache_key(self, request, view):return request.user
可以配置redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "密码",
}
}
}
匿名用户的访问频率限制,这里设置在全站下,如下:
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": ["appxx.utils.VisitThrottle"],
"DEFAULT_THROTTLE_RATES":{
"AnonymousUser": "3/m", # 匿名用户一分钟可以访问3次,秒(s)、分(m)、时(h)、天(d)
"LoginUser": "10/m", # 登录用户一分钟可以访问10次
}
}
登录用户的访问频率设置在单独的视图中,而视图依赖身份认证才能辨别用户是否登陆了,所以设置如下:
class BookViewSet(viewsets.ModelViewSet):
authentication_classes = [TokenAuthentication]
throttle_classes = [UserThrottle]
queryset = models.Book.objects.all()
serializer_class = serializers.BookSerializer
用户身份认证如下:
from rest_framework import authentication
from rest_framework import exceptionsfrom appxx import models
class TokenAuthentication(authentication.BaseAuthentication):
"""身份认证"""
def authenticate(self, request):
token = request.GET.get("token")
obj = models.UserAuthToken.objects.filter(token=token).first()
if not obj:
raise exceptions.AuthenticationFailed("验证失败!")
else:
return (obj.user.username, obj.token)
来源:https://www.cnblogs.com/believepd/p/10278207.html


猜你喜欢
- 关于中大型开发b/s开发中的缓存(cache),我的一些看法,有不正确的或者是有笔误的地方,请指正。thanks首先,应该了解基本的,对于缓
- 上代码:#coding=utf-8import cv2import dlibpath = "imagePath/9.jpg&quo
- 在jQuery的官方文档中,提示用户这是一个低级的方法,应该用.data()方法来代替。$.data( element, key, valu
- 使用现有的txt文本和图片,就可以用wordcloud包生成词云图。大致步骤是:1、读取txt文本并简单处理;2、读取图片,以用作背景;3、
- 问题:我们每天都要编写一些Python程序,或者用来处理一些文本,或者是做一些系统管理工作。程序写好后,只需要敲下python命令,便可将程
- 1. 引言因为在学习遗传算法路径规划的内容,其中遗传算法中涉及到了种群的初始化,而在路径规划的种群初始化中,种群初始化就是先找到一条条从起点
- 如下所示:# -*- coding: utf-8 -*-# @Author: xiaodong# @Date: just hid
- bottle是一个小型web框架,很小只有一个文件,但功能确很强大,学起来也简单,简单和小巧的同时也有很多不足,某些功能支持还不是很完善,比
- 如下所示:import ioimport torchimport torch.onnxfrom models.C3AEModel impor
- 简介🤔看了一圈,大家对 ts 封装 axios 都各有见解。但都不是我满意的吧,所以自己封装了一个💪。至于为什么敢叫最佳实践,因为我满意,就
- 有没有想过用尺子来直接量网页上的区块间距,文字行高?屏幕标尺就是干这个的。这个功能非常适合F2E在调试样式尺寸的时候使用。打开屏幕标尺,屏幕
- 将视图与缓存系统进行了耦合,从几个方面来说并不理想。 例如,你可能想在某个无缓存的站点中重用该视图函数,或者你可能想将该视图发布给那些不想通
- <%Class Cls_TemplateDim RegDim PageDim CIDDim SIDDim RuleDim Conten
- 这篇文章主要介绍了在SQL Server中处理空值时所涉及的3个问题:计数、使用空表值以及外键处理。用COUNT(*)处理空值大多数集合函数
- 下面先看下js禁止右击保存图片。禁止鼠标右键保存图片<img src="" oncontextmenu="
- 1. 如何阻止事件冒泡 //非IE if (event && event.stopPropagation) event.st
- 1、引言小 * 丝:鱼哥,这个周末过得咋样小鱼:酸爽~ ~小 * 丝:额~~ 我能想到的,是这样吗?小鱼:有多远你走多远。小 * 丝:唉,鱼哥,你别说,
- 区别IE6与FF:background:orange;*background:blue;区别IE6与IE7:background:green
- django接口可以通过localhost或者127.0.0.1进行访问,但无法通过本机ip地址访问1. 修改django项目中的setti
- 在数据分析中经常需要从csv格式的文件中存取数据以及将数据写书到csv文件中。将csv文件中的数据直接读取为 dict 类型和 DataFr