一:源码剖析
DRF的版本控制、认证、权限、频率组件都在initial方法里初始化
我们点进去看看:
其实我们版本、认证、权限、频率控制走的源码流程大致相同。
我们的权限类中一定要有has_permission方法——框架为我们提供的钩子。
我们再来看看rest_framework.permissions文件中存放的框架为我们提供的所有权限的方法:
注意图中的BasePermission类,这个类是框架为我们提供的基础权限类,我们自定义的权限类都要继承此类。
全局权限配置(settings.py文件):
REST_FRAMEWORK = {
# 配置全局认证
'DEFAULT_AUTHENTICATION_CLASSES': ["指定自定义的权限类", ]
}
DRF默认的认证类型:
二:使用方法
数据模型:
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
token = models.UUIDField(null=True, blank=True)
type = models.IntegerField(choices=((1, '普通用户'), (2, 'VIP'), (3, 'SVIP')), default = 1)
自定义权限类:
from rest_framework.permissions import BasePermission # 导入基础的权限类
class MyPermission(BasePermission):
"""必备的属性和方法,基本固定的逻辑"""
message = "普通用户无权访问的数据"
def has_permission(self, request, view):
# 注意:源码中初始化时的顺序是认证在前,权限在后,所以只要认证通过
# 获取认证控制的返回值
print("用户名:", request.user)
user_obj = request.user
print(user_obj)
if user_obj.type == 1:
return False # 普通用户
return True # VIP及以上
路由设计:
urlpatterns = [
re_path(r'^login/$', views.LoginView.as_view()),
re_path(r'^test_permission/$', views.TestPermissionView.as_view()),
]
测试视图类:
class TestPermissionView(APIView):
# 在视图中增加如下属性,即表明此视图要走如下组件的逻辑
authentication_classes = [MyAuth, ] # 自定义的认证组件
permission_classes = [MyPermission, ] # 权限控制组件
def get(self, request):
return Response("这里是VIP及以上用户能访问的数据")
测试:这里我在数据库中添加了两个用户:ginvip为普通用户;admin为VIP用户
普通用户访问:
admin用户测试: