1.1.1 继承BaseAuthentication
1.1.2 钩子函数名是确定的
1.1.3 返回值返回两个参数,request.user 和 request.auth,即 user_obj 和 token
1.1.4 获取 token 的方式有多种,见贴图
from rest_framework import authentication
from django.core.cache import cache
from rest_framework.request import Request
from rest_framework.exceptions import AuthenticationFailed
from app_auth import models
class Authentication(authentication.BaseAuthentication):
def authenticate(self, request: Request):
token = request.META.get('HTTP_AUTHORIZATION') # redis获得 token
user_pk = cache.get(token) # 有 token 获得 user_id
if user_pk:
user_obj = models.User.objects.filter(pk=user_pk).first()
cache.set(token, user_pk, 60 * 20) # redis重新设置最大过期时间
return user_obj, token
raise AuthenticationFailed('非法操作') # 没有 tok
1.2.1 导入自己写的认证类,使用方法如下,可以接收多个
class TestView(APIView):
# 认证组件直接使用
authentication_classes = [auth.Authentication, ]
def get(self, request):
return Response('测试认证组件')
2.1.1 继承BasePermission
2.1.2 定义 message ,定义内容为 错误信息
2.1.3 权限的定义类有多中,见贴图
from rest_framework import permissions
from rest_framework.request import Request
class UserPermission(permissions.BasePermission):
message = '权限不足'
def has_permission(self, request: Request, view):
# request.user.has_perm()
# 超管全是 True
if 'app01.view_book' in [item for item in request.user.get_all_permissions()]:
return True
return False
2.2.1 导入自己写的权限类,使用方法如下,可以接收多个
class TestPermission(APIView):
# 认证
authentication_classes = [auth.Authentication, ]
# 权限
permission_classes = [permissions.UserPermission, ]
def get(self, request):
return Response('可以观看 vip 电影')
3.1.1 继承SimpleRateThrottle
3.1.2 scope 的内容在 settings 里面定义
3.1.3 其余内容不变
from rest_framework.throttling import SimpleRateThrottle
class MyThrottle(SimpleRateThrottle):
scope = 'MM'
def get_cache_key(self, request, view):
# 拿到ip地址
return self.get_ident(request)
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [],
# 添加如下,代表同一个 ip 一分钟可以访问 3 次
"DEFAULT_THROTTLE_RATES": {"MM": "3/m", }
}
3.4.1 导入自己写的频率限制类,使用方法如下,可以接收多个
class TestPermission(APIView):
# 认证
authentication_classes = [auth.MyAuth, ]
# 权限
permission_classes = [permissions.MyPermission, ]
# 限制访问
throttle_classes = [throttle.MyThrottle]
def get(self, request):
return Response('可以观看 vip 电影')
import time
VISIT_RECORD = {}
class MyThrottle(object):
"""
一分钟允许访问5次
"""
def __init__(self):
self.history = []
def allow_request(self, request, view):
# 获取用户的IP地址
ip = request.META.get("REMOTE_ADDR", "")
if ip not in VISIT_RECORD:
VISIT_RECORD[ip] = [time.time(), ]
else:
history = VISIT_RECORD[ip]
self.history = history
history.insert(0, time.time())
# 确保列表时间是允许范围之内
while self.history[0] - self.history[-1] > 60:
self.history.pop()
# 判断列表长度
if not len(self.history) <= 5:
return False
return True
# 等待时间
# [最近时间, 最老时间]
def wait(self):
return 60 - (self.history[0] - self.history[-1])
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。