Python Django restframework 自定义权限及使用,适用于自定义指定model的权限
现在我有个model,如下:
class PayItems(models.Model):
"""项目收费"""
item_name = models.CharField(max_length=50, verbose_name='项目名称')
charge_amount = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='收费金额')
def __str__(self):
return self.item_name
class Meta:
db_table = 'payitems'
verbose_name = '项目收费'
现在为这个model自定义一个只读 或 只有拥有改model的所有权限的人,才可以进行post,put,delete操作
from rest_framework import permissions
from django.contrib.auth.models import Permission
class IsPyitemsOrReadOnly(permissions.BasePermission):
"""
自定义权限,只读或有Pyitems的所有权限可以访问
"""
def has_permission(self, request, view):
# 只读method
if request.method in permissions.SAFE_METHODS:
return True
# 得到pyitems的所有权限
permission_list = []
for i in Permission.objects.filter(content_type_id=11):
permission_list.append('database.' + i.codename)
permission_pyitems = tuple(permission_list)
return request.user.has_perms(permission_pyitems)
其中
Permission.objects.filter(content_type_id=11) # 11为django自带表auth_permisssion,所关联的django_content_type表的id
看图
这个是auth_permission表
这个是django_content_type表11就是这么来的。
user.has_perms(permission_pyitems)
这里的has_perms就是验证user有没有permission_pyitems权限,
permission_pyitems是一个元祖,其中写需要验证的权限
想要验证单独一个权限的话,用
user.has_perm(permission)
使用方式:
from rest_framework import permissions
导入 PayitemsSerializer 和 Pyitems
class PayItemsView(viewsets.ModelViewSet):
"""
项目收费
"""
# 权限认证
permission_classes = (permissions.IsAuthenticated, IsPyitemsOrReadOnly)
queryset = PayItems.objects.all()
serializer_class = PayitemsSerializer
其中
permissions.IsAuthenticated # 这个权限是只允许通过验证的用户访问
关于Django权限可以看我写的Django Web系列一 内置登录及默认权限的使用方法
本章完。