【问题标题】:DRF: appending data to each responseDRF:将数据附加到每个响应
【发布时间】:2017-06-12 12:41:25
【问题描述】:

我们正在使用 Django 1.11 和 Django Rest Framework 并尝试实现一些高级权限系统。

目前,我们遇到了一些技术问题,其中之一是:针对每个请求返回当前登录用户的链接权限(通过 request.user)。

示例:端点http://localhost:8000/articles/1/ 应向用户返回有关该文章和链接权限的信息。 像这样的:

{'title': 'Article Title', 'pages': 50, 'permissions': ['can_read_article', 'can_update_article'] ...}

这些权限应该在 Django Admin > Users & Groups 系统中进行管理。

非常感谢,任何帮助将不胜感激

【问题讨论】:

  • 您是否已经拥有将权限链接到每个实体的东西,例如 ForeignKey?
  • 一切都由 Django Admin 应用程序管理:用户链接到具有权限的组。
  • 啊,所以您不是在获取与当前正在服务的实体相关的权限,而是针对用户自己?这似乎很奇怪,对文章的请求应该获取该文章的详细信息,而不是关于请求用户的无关信息。
  • 一般的想法是返回文章的详细信息,包括请求用户拥有的权限。因此,具有内容编辑角色的用户应该会在文章的概述页面上看到“更新”按钮链接。

标签: django permissions django-rest-framework


【解决方案1】:

您可以尝试通过使用Serializer Method Field 获取该信息来实现此目的:

class ArticleSerializer(serializers.ModelSerializer):
    permissions = serializers.SerializerMethodField()

    def get_permissions(self, obj):
        user = self.context['request'].user

        # compute permissions
        #permissions = user.get_all_permissions() # if you are using Django's permissions, see note below
        permissions = get_perms(user, obj) # if you are using django-guardian

        return permissions

请注意,如果您使用来自 django.contrib.auth 的 Django 权限,它没有对象级权限,我认为您的方法不是最佳方法:与其返回每个请求的所有权限,不如返回更多通过单独的调用有效地获取所有用户的权限并将其存储在前端的某个位置以供以后使用。 另一方面,如果您使用对象级权限,例如django-guardian,那么这种方法似乎很合适。

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2013-09-21
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多