Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用不同的端点集Django Rest框架实现权限组的动态创建_Rest_Design Patterns_Django Rest Framework_Architecture_Django Permissions - Fatal编程技术网

如何使用不同的端点集Django Rest框架实现权限组的动态创建

如何使用不同的端点集Django Rest框架实现权限组的动态创建,rest,design-patterns,django-rest-framework,architecture,django-permissions,Rest,Design Patterns,Django Rest Framework,Architecture,Django Permissions,在我的项目中,我有很多端点视图(APIViews、Viewset)。对于所有这些,我现在设置了权限,其中一些是默认的(例如AllowAny),一些是自定义创建的: permission\u classes=(IsUserHaveSomePermission,) 现在我想实现一些灵活的系统,允许我为每个用户指定一组允许的端点,例如: 在前端,我想选择一些用户,并有一个对应于项目端点的复选框列表 这只是一个乌托邦式的解决方案,一些细节可能会改变,但主要的问题是如何做一些类似的事情,以便管理员基本上

在我的项目中,我有很多端点视图(APIViews、Viewset)。对于所有这些,我现在设置了权限,其中一些是默认的(例如AllowAny),一些是自定义创建的:

permission\u classes=(IsUserHaveSomePermission,)

现在我想实现一些灵活的系统,允许我为每个用户指定一组允许的端点,例如:

在前端,我想选择一些用户,并有一个对应于项目端点的复选框列表

这只是一个乌托邦式的解决方案,一些细节可能会改变,但主要的问题是如何做一些类似的事情,以便管理员基本上可以动态地为用户更改允许的端点/视图列表?
提前感谢

如果用户有权访问当前请求方法和请求路径,则可以通过存储来实现此解决方案

创建一个新的数据库模型,用于存储用户、请求方法和请求路径。假设模型的名称为RequestPermission

您可以存储一个表示url的常量,而不是路径,以便以后可以灵活地编辑路径。此常量可以是django支持的

class RequestPermission(models.Model):
    user = user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='request_permissions')
    method = models.CharField(max_length=10)
    path_name = models.CharField(max_length=200)
创建自定义权限类:

class IsUserResuestAllowed(permissions.BasePermission):

    def has_permission(self, request, view):
        user = request.user
        # you can choose how to get the path_name from the path
        path_name = get_path_name(request.path)
        return RequestPermission.objects.filter(user=user, method=request.method, path_name=path_name).exists()

现在,您可以在rest框架设置中使用该类作为默认权限类,也可以在每个视图中使用它。

是的,我考虑过类似的解决方案,但在这里,我仍然需要硬编码所有现有的路径名及其http方法。我希望我能有一些函数
get_api_endpoints()
,它会返回一些列表,比如
[{url:'api/v1/endpoint',name:'url path name',methods:['post','delete',…]},…]
,这样我就可以很容易地将它们显示在某个地方。对于任何需要这个函数的人来说,我的部分原因是因为注意:所有的url都应该有名称