drf认证、权限、频率实现

drf认证功能实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1.创建一个任意的py文件,在里面任意的定义一个类,假设该类名为MyAuth

2.继承BaseAuthentication
from rest_framework.authentication import BaseAuthentication 从这里导入

3.为该类创建一个authenticate方法

4.在该类中书写认证方法,如果认证成功返回none或元祖,认证失败的话抛出一个异常AuthenticationFailed

eg:
class Login_Auth(BaseAuthentication):
def authenticate(self,request):
token = request.GET.get('token')
try:
models.Auth.objects.get(token=token)
return None #ps:也可以返回一个元祖
except:
raise AuthenticationFailed('还未登录,请先登录')

drf权限功能的实现

1
2
3
4
5
6
7
8
过程与认证功能基本一致,只不过创建的类继承的类不一样,权限功能继承的类为BasePermission
重写的方法为has_permission
class BookPermission(BasePermission):
def has_permission(self, request, view): #这里的request与view为之前认证功能返回的元祖中的数据
if request.user.user_type == 1:
return True #如果权限通过返回true
else:
return False #如果权限未通过返回false

内置频率类使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
django为我们提供了多个限制频率类
BaseThrottle:基类
AnonRateThrottle:限制匿名用户的访问次数 #内部通过request.user.isauthenticed判断
SimpleRateThrottle:可以通过自定义扩写它
ScopedRateThrottle:
UserRateThrottle:限制登录用户访问次数


使用方法,新建一个类继承SimpleRateThrottle,内部定义一个scope属性,并且重写get_cache_key方法
class MyThrottle(SimpleRateThrottle):
scope = 'xxx'
def get_cache_key(self, request, view):
return self.get_ident(request)

在setting.py中配置
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['app01.auth.MyThrottle',],
'DEFAULT_THROTTLE_RATES' : {
'xxx':'10/m'# key跟scope对应,value是一个时间
}
}

认证功能、权限功能、频率功能局部使用和全局使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1 全局使用(所有接口,都需要登录才能访问)
-在配置文件中
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.MyAuthen.LoginAuth", ], #认证有关
"DEFAULT_PERMISSION_CLASSES": ["app01.MyAuthen.SuperPermission", ] #权限有关
"DEFAULT_THROTTLE_CLASSES":['app01.auth.MyThrottle',],#频率相关
'DEFAULT_THROTTLE_RATES' : {
'xxx':'10/m'# key跟scope对应,value是一个时间
}
}
2 局部使用
-在想局部使用的视图类上
authentication_classes = [MyAuthen.LoginAuth,] #认证有关
permission_classes = [MyAuthen.SuperPermission] #权限有关
throttle_classes = [auth.MyThrottle]
3 局部禁用
-在想禁用的视图类上
authentication_classes = []