Django应用自定义用户权限

时间:2016-03-31 13:46:25

标签: python django

我目前正在使用此方法向用户提供与其相关的页面。

def get_user_url(request):
    un = request.user.username
    t = get_template(un + '.htm')
    html = t.render()
    return HttpResponse(http)

我只期待少数用户,每个用户代表一家公司,所以这不是问题,因为我可以简单地拥有五个或六个具有不同内容的html文件。 现在我被要求为每个公司的多个用户负责,假设同一公司的用户具有不同的权限。

所以我查看了自定义权限的文档:https://docs.djangoproject.com/en/dev/topics/auth/customizing/#custom-permissions这可能会有效但我可能最终得到一个30行的权限类,如下所示,这对我来说是一种糟糕的方式。

permissions = (
        ("company1_permission1", "Company 1 Permission 1"),
        ("company1_permission2", "Company 1 Permission 2"),
        ("company2_permission1", "Company 1 Permission 1"),
        ("company2_permission2", "Company 1 Permission 2"),
        ("company3_permission1", "Company 1 Permission 1"),
    )

有没有办法可以添加一家'公司'字段给用户并使用上述两种方法?因此,除非来自合适的公司,否则用户甚至不会访问页面。然后在该页面中,我将自定义权限应用于该页面上的内容。

或者是有更好的方法来实现这种功能。 我是django和python的新手。

1 个答案:

答案 0 :(得分:1)

一个好的解决方案是使用@user_passes_test() decorator

文档为确保用户的电子邮件来自特定公司提供了一个很好的示例,您可以轻松地根据您的用例进行调整:

from django.contrib.auth.decorators import user_passes_test

def email_check(user):
    return user.email.endswith('@example.com')

@user_passes_test(email_check)
def my_view(request):
    ...

此方法的主要问题是您无法访问代码中的request对象。解决方案是使用基于类的视图,UserPassesTestMixin可以访问self.request