首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django基于角色的视图?

Django基于角色的视图?
EN

Stack Overflow用户
提问于 2009-10-10 00:29:48
回答 9查看 26K关注 0票数 34

我正在寻找一些关于其他人如何架构这一点的意见。我将提供基于类(django组)的视图。

例如,用户组将决定他或她将有权访问的视图/模板。我正在考虑将视图函数的路径存储在一个表中,以确定用户的链接栏将由什么组成。还可以存储筛选器规范,以确定哪些行将填充这些模板。

医院护理单位就是一个很好的例子。一个单位的护士不需要看整个医院的病人。他们只需要去看他们的病人。同一单位的医生也只需要看这些患者,但他们应该可以访问更大的功能。

这是通过一些第三方应用程序完成的吗?你将如何处理这个问题?

谢谢,皮特

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-10-10 01:00:28

Django已经有一个组和权限系统,这可能足以满足您的目的。

http://docs.djangoproject.com/en/dev/topics/auth/

通常,在您的代码中,您可以检查用户是否具有权限。用户拥有自己的权限和所属组的权限。您可以很容易地从管理控制台进行管理。

您需要注意两个部分。

  1. 检查请求页面的用户是否具有执行此操作的权限。
  2. 仅在用户具有该权限时才显示指向该用户的链接。

对于1。您可以在装饰器中检查权限,如下所示:

代码语言:javascript
运行
复制
from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def some_view(request):

对于2.当前登录用户的权限存储在模板变量{{ perms }}中。此代码检查与上面相同的权限。

代码语言:javascript
运行
复制
{% if perms.polls.can_vote %}
    <a href="/vote">vote</a>
{% endif %}

要生成链接列表,可以遍历user.get_all_permissions()并从字典中获取链接(或生成链接的函数):

代码语言:javascript
运行
复制
def more_elaborate_list_of_links_for_a_perm(user):
    return ["/link1", ...]

_LINKS = {
    'polls.can_vote' : lambda u: ["/user/specific/link/" + u.id],
    'polls.can_close': lambda u: ['/static/link/1', 'static/link/2'],
    'polls.can_open' : more_elaborate_list_of_links_for_a_perm
}

def gen_links(user):
    # get_all_permissions also gets permissions for users groups
    perms = user.get_all_permissions()
    return sum((_LINKS[p](user) for p in perms if p in _LINKS), [])

可能还有很多其他的方法。

票数 46
EN

Stack Overflow用户

发布于 2009-10-29 14:01:03

我们也遇到过类似的问题。Django的团队并不适合这样做,但你可以硬塞给他们。

我们这样做的方法如下:

每个访问控制对象都与groups表有一个ManyToMany关系。每个组用于定义特定类型的权限(“可以查看患者基本信息”、“可以编辑患者联系信息”等)。用户被添加到他们应该拥有权限的组中(在您的示例中,仅在此医院中查看患者,您可以有一个“valley view- have”组)。

然后,当您要向用户显示记录列表时,您可以根据这两个组的连接进行筛选。用户必须拥有所有关联的组权限才能查看给定对象。

如果您的系统需要,您可以保留一个单独的负权限ManyToMany,或单独的读/写权限。您还可以定义一组元组(医生、护士),以使查找筛选器检索实际的权限子集。

就您的链接栏问题而言,您可以基于用户可以查看或编辑的对象类,使用相同的系统过滤器以编程方式生成这些链接,然后使用get_absolute_url()类型函数(也可以称为get_index_url())返回每个对象类的索引的链接。

因为所有这些都相当复杂,所以您最终可能希望为这些内容做一些级别的缓存,但在进行优化之前先让它正常工作。这是可能的,而且它在代码中的丑陋程度比在语言中要低。

票数 5
EN

Stack Overflow用户

发布于 2009-11-03 00:39:19

在Django中有一个非常有趣的关于基于角色的权限的新项目:http://bitbucket.org/nabucosound/django-rbac

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1546670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档