【问题标题】:How to do permissions right in Django如何在 Django 中正确设置权限
【发布时间】:2014-06-24 15:30:21
【问题描述】:

我在 django 中实现了一个权限系统,但它非常基础,我认为可能有更好的方法。

据我了解,权限是附加到某些用户的标签,然后由我决定与他们关联的操作。例如,can_edit 只是某些用户可以执行的操作的名称,这将由我稍后决定。

我使用命令行在某个模型上创建了can_edit权限,

from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Group, User, Permission

itmod_ct = ContentType.objects.get(app_label='myapp', model='mymodel')
can_modify = Permission(name='Can Modify', codename='can_modify_model', content_type=itmod_ct)
can_modify.save()
#some group of users g
g.permissions = (can_modify,)
g.save()

然后在模板中,我通过在其中包含相关功能来强制执行它

{% if perms.myapp.can_modify_model %}
... action that can be performed
{% endif %}

这种方法的主要问题是,假设我现在在未来实现一个 API,即执行相同操作但没有该模板的东西,那么应用程序就好像没有实现任何权限/授权一样。另一个(哲学)问题是在模板中使用业务逻辑。此外,我的大部分观点对所有用户都是通用的,除了一些内容是可编辑的。

【问题讨论】:

    标签: django django-permissions


    【解决方案1】:

    re "a can_edit permission on a certain model" ...'add', 'change' 和 'delete' 权限是 Django 为每个模型自动创建的,所以这可能是多余的

    正在这样做:

    {% if perms.issuetracker.can_modify_itmod %}
    ... action that can be performed
    {% endif %}
    

    这没关系,只是因为这不应该是实际执行权限的地方。这只是一些代码来决定向用户显示什么选项。权限的实际执行将发生在处理该操作的视图中。

    这完全取决于您,但通常希望尽可能地将业务逻辑一直推到模型中,尽管通常在视图层还有很多工作要做。您是正确的,业务逻辑不应该留给模板中的代码。

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2011-08-16
      • 2011-09-27
      相关资源
      最近更新 更多