一、基本知识
1. 该三个组件阅读源码的方式和版本源码阅读步骤类似
详细阅读版本源码https://www.cnblogs.com/yingjp/p/10606698.html
2. 进入initial可以看到以下方法
#认证执行的方法:校验用户(游客,合法用户,非法用户)
self.perform_authentication(request)
#权限执行的方法:校验用户权限,必须登录,所有用户登录读写,游客只读,自定义用户角色
self.check_permissions(request)
#频率执行的方法:限制视图接口被访问的频率次数
self.check_throttles(request)
3. 进一步对上述的方法进行阅读我们能得出以下几点
a:在settings中应该怎样配置
b:自定义组件需要实现什么方法
c:方法的返回值
d:对应的属性取值的方法
4. 对认证,权限,频率这三个逐渐学习步骤
a:用rest_framework给我们提供的模块进行定制
b:自己定义组件
5. 认证、权限、频率的工作原理
a:基于哪个类、重写哪个方法、方法的实现体要完成什么事
二、认证组件
1. 阅读源码结论
a:认证类需要继承BaseAuthentication类
b:需要实现authenticate(self, request)方法
c:返回一个长度为2的元祖
d:settings可以通过DEFAULT_AUTHENTICATION_CLASSES
配置全局验证
2. 自定义认证类(配置全局认证)
a:先写一个认证类
from rest_framework.authentication import BaseAuthentication
from testDemo.models import UserInfo
from rest_framework.exceptions import AuthenticationFailed
'''
这里是写的token是存在url中
1:需要继承BaseAuthentication
2:需要重写authenticate()方法
3:返回一个元祖
'''
class MyAuth(BaseAuthentication):
#自定义token在url中
def authenticate(self, request):
token = request.query_params.get('token','')
user=UserInfo.objects.filter(token=token).first()
if not user:
raise AuthenticationFailed('token 信息不合理')
return (user,token)
b:settings注册
--所有的视图函数都会进行认证,其实还不是很必要(局部认证下面介绍)
REST_FRAMEWORK={
#认证注册
'DEFAULT_AUTHENTICATION_CLASSES':['utils.auth.MyAuth',],
}
3. 使用rest_framework提供的认证组件进行认证。
认证组件一般都是自己写的,这里介绍自定义组件只是了解,学习视图函数的局部认证。
a:通过BaseAuthentication这个认证的基类,点进去就能看见所有认证类,使用方式和自定义的认证类一样
b:局部视图的认证,在需要认证的视图处添加authentication_classes=[authclass1,authclass2]
from utils.auth import MyAuth
# Create your views here.
from rest_framework.views import APIView,Response
import uuid
from testDemo.models import UserInfo
# Create your models here.
class authDemo(APIView):
authentication_classes = [MyAuth, ]
def get(self, request):
print(request.user)
print(request.auth)
return Response('测试代码')
三、权限组件
1. 阅读代码结论
a:settings全局配置key'DEFAULT_PERMISSION_CLASSES'
b:视图函数局部配置参数permission_classes
c:权限类需要继承的类from rest_framework.permissions import BasePermission
d:需要重写的方法has_permission(self, request, view)
2. 自定义权限类
from rest_framework.permissions import BasePermission
class MyPermissions(BasePermission):
def has_permission(self, request, view):
#登陆成功后登陆信息,存在request.user中
user_obj =request.user
#type ==3 普通用户没有该权限
if user_obj.type ==3:
return False
return True
3. 权限配置
参考第一条。