【问题标题】:Issue with Django rulesDjango规则问题
【发布时间】:2019-02-05 11:05:36
【问题描述】:

我正在使用 Django 的规则库,但我无法为特定菜单定义规则。

规则库在那里可用:rules library

我在我的网络应用程序中登录为admin

我有一个像这样的 menus.py 文件:

class AdminMenuItem(MenuItem):
    def check(self, request):
        return self.allow(request.user)

    @staticmethod
    def allow(user):
        return user.has_perm('app.access_admin_menu')

Menu.add_item('admin', MenuItem('Admin', '#admin', children=settings_children,
                            check=lambda request: AdminMenuItem.allow(request.user)))

settings_children = (
    ...
    AdminMenuItem("Manage Animals", reverse("animal-list-crud"), weight=10),
    AdminMenuItem("Statistics", reverse("statistics"), weight=140)
)

然后我在我的 rules.py 文件中定义:

from rules.permissions import add_perm
from rules.predicates import predicate


@predicate
def is_admin(user):
    if user.is_anonymous:
        return False
    return True if user.profile.type == 'ED' and user.profile.role == 'AD' else False

# Rules for admin_menu.
add_perm('app.access_admin_menu', is_admin)

# Rules for animal.
add_perm('app.view_animal', is_admin)
add_perm('app.add_animal', is_admin)
add_perm('app.change_animal', is_admin)
add_perm('app.delete_animal', is_admin)

它适用于动物菜单(它是 CRUD 部分)。但是当我尝试访问统计部分(这不是 CRUD)时,出现错误403 Access forbidden

我的代码中忘记了什么?

谢谢

【问题讨论】:

  • rules 是第 3 部分应用程序,而不是 django 内置或 contrib 应用程序。提及这一点并将 url 发布到 django-rules 页面会更好,特别是因为至少有 2 个名为“django-rules”的包。
  • 您使用的是哪个 Django 版本?在 1.10 之前,User.is_anonymous() 是一个方法,因此 bool(user.is_anonymous)is_anonymous 之后没有括号)将始终为真,因为方法对象为真。如果您使用 1.10 之前的任何内容,则必须使用 user.is_anonymous()(带括号)
  • @brunodesthuilliers 感谢您的评论。我在我的项目中使用 Django 1.11.18。所以看起来不错不是吗?
  • 是的,对于 Django 1.11,您的代码是正确的(至少,这个测试)。
  • 我带来了一些修改,但到目前为止我还没有克服来访问这部分(统计数据)。它仍然是 403 访问被禁止。我正在更新我的问题(代码部分)

标签: python django django-rules


【解决方案1】:

我找到了解决方案。上面公开的代码很好,但它在我的 ma​​in.py 代码中遗漏了一些东西。

class StatisticsView(PermissionRequiredMixin, View):
    """ Render the statistics page with a form to generate various stats """

    permission_required = 'app.access_statistics'
    ...

在我的课堂上,我忘记了 PermissionRequiredMixinpermission_required = 'app.access_statistics' 的属性。 通过添加这两个元素,它现在可以工作了!

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多