drf 如何自定义权限类来判断用户是否有访问视图的权限
时间: 2024-03-03 14:47:09 浏览: 22
在 Django Rest Framework 中,可以通过继承 `BasePermission` 类并实现 `has_permission` 和 `has_object_permission` 方法来自定义权限类,以判断用户是否有访问某个视图的权限。
`has_permission` 方法用于判断用户是否有访问该视图的权限,而 `has_object_permission` 方法用于判断用户是否有访问该视图中某个对象的权限。这两个方法都接受两个参数:`request` 和 `view`,分别表示用户发出的请求和当前视图。
例如,我们可以自定义一个权限类 `MyPermission`,判断用户是否为超级用户或是否具有某个特定权限:
```
from rest_framework.permissions import BasePermission
class MyPermission(BasePermission):
def has_permission(self, request, view):
return request.user.is_superuser or request.user.has_perm('myapp.can_access_my_view')
def has_object_permission(self, request, view, obj):
# 对象级别的权限判断,比如判断当前用户是否为该对象的拥有者
pass
```
在上面的代码中,`MyPermission` 类继承自 `BasePermission` 类,并实现了 `has_permission` 和 `has_object_permission` 方法。在 `has_permission` 方法中,根据当前用户是否为超级用户或是否具有 `myapp.can_access_my_view` 权限来判断用户是否有访问该视图的权限。在 `has_object_permission` 方法中,可以进行对象级别的权限判断,例如判断当前用户是否为该对象的拥有者等。
然后,可以在视图中使用自定义的权限类 `MyPermission`,例如:
```
from rest_framework.views import APIView
from .permissions import MyPermission
class MyView(APIView):
permission_classes = [MyPermission]
def get(self, request):
# 处理 GET 请求的代码
pass
```
在上面的代码中,`MyView` 视图使用了自定义的权限类 `MyPermission`,只有满足 `MyPermission` 中的条件,才能访问该视图。