在线自动生成接口文档 地址:swagger.io
https://blog.csdn.net/qq_41141246/article/details/121370246
django第三方库 django-rest-swagger
#pip install django-rest-swagger
#settings.py中添加应用
INSTALL_APPS = [
...,
'rest_framework_swagger',
]
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
#在urls.py中
from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title='项目接口文档')#此时就是三方库封装好的视图函数
urlpatterns = [
path(...),
path('api/docs/',schema_view), #吧这个视图函数添加进来
]
启动项目,访问这个url就可以看到接口文档
==============================================================
drf的限流访问(拿之前的租房项目为例)
#使用限流的话,需要配置redis数据库
#sittings.py中(配置drf)
REST_FRAMEWORK = {
# 配置默认页面大小
'PAGE_SIZE': 5,
#配置默认限流类
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
#'rest_framework.throttling.UserRateThrottle' #暂时注释掉(用户登陆成功后的限流)
),
'DEFAULT_THROTTLE_RATES':{
'anon':'5/min',
# 'user':'10000/day' #暂时注释掉(用户登陆成功后,每天限制访问次数1万次)
}
#现在如果去访问接口1分钟只能访问3次接口,当然这个配置可能不合理,根据项目实际需求看情况而定
如何自定义频率类
频率校验的规则
自定义频率类是最常见的:短信验证码接口一分钟只能发送一条短信
自定义频率类
自定义类继承SimpleRateThrottle
设置类实现scope,值就是一个字符串,与settings中的DEFAULT_THROTTLE_RATES进行对应 DEFAULT_THROTTLE_RATES就是设置scope绑定的类的频率规则:1/min 就代表一分钟只能访问一次
重写 get_cache_key(self, request, view) 方法,指定限制条件 不满足限制条件,返回None:代表对这类请求不进行频率限制 满足限制条件,返回一个字符串(是动态的):代表对这类请求进行频率限制 短信频率限制类,返回 “throttling_%(mobile)s” % {“mobile”: 实际请求来的电话}
系统频率类
案例
throttles.py
from rest_framework.throttling import SimpleRateThrottle
# 只限制查接口的频率,不限制增删改的频率
class MethodRateThrottle(SimpleRateThrottle):
scope = 'method'
def get_cache_key(self, request, view):
# 只有对get请求进行频率限制
if request.method.lower() not in ('get', 'head', 'option'):
return None
# 区别不同的访问用户,直接的限制是不冲突的
if request.user.is_authenticated:
ident = request.user.pk
else:
# get_ident是BaseThrottle提供的方法,会根据请求头,区别匿名用户,
# 保证不同客户端的请求都是代表一个独立的匿名用户
ident = self.get_ident(request)
return self.cache_format % {'scope': self.scope, 'ident': ident}
settings.py
REST_FRAMEWORK = {
# ...
# 频率规则配置
'DEFAULT_THROTTLE_RATES': {
# 只能设置 s,m,h,d,且只需要第一个字母匹配就ok,m = min = maaa 就代表分钟
'user': '3/min', # 配合drf提供的 UserRateThrottle 使用,限制所有用户访问频率
'anon': '3/min', # 配合drf提供的 AnonRateThrottle 使用,只限制匿名用户访问频率
'method': '3/min',
},
}
views.py
from .permissions import IsVipUser
from .throttles import MethodRateThrottle
class CarViewSet(ModelViewSet):
permission_classes = [IsVipUser]
throttle_classes = [MethodRateThrottle]
queryset = models.Car.objects.all()
serializer_class = serializers.CarSerializer