如何用urls.py自定义django auth decorator?

时间:2016-11-28 03:51:27

标签: python django decorator

我定义了几个网址:

url(r'^board/$', TemplateView.as_view(template_name='recruit/board.html'), name='recruit_board'),
url(r'^job/$', login_required(TemplateView.as_view(template_name='recruit/job_detail.html')), name='job_detail'),
url(r'^company/$', login_required(TemplateView.as_view(template_name='recruit/company_detail.html')), name='company_detail'),

...我设计的用户有两种帐户类型: A B

“作业”网址只能由拥有 A 帐户类型的用户访问,而“公司”网址只能由 B 帐户类型用户查看。如果用户尝试访问错误的网址,则会将其重定向到“主板”网址。

我使用了 login_required 装饰器,我知道 user_passes_test ,但我不知道如何从这里开始。我可以编写一个像 login_required 一样的新装饰器并得到我想要的东西吗?

1 个答案:

答案 0 :(得分:1)

我认为group_required decorator符合您的目的。

我假设您有三个组['admin', 'job', 'company'],您可以像这样编写代码。由于group_required已选中is_authenticated,因此您不再需要login_required

from django.conf.urls import url
from django.views.generic import TemplateView
from django.contrib.auth.decorators import user_passes_test

def group_required(*group_names):
    """Requires user membership in at least one of the groups passed in."""
    def in_groups(u):
        if u.is_authenticated():
            if bool(u.groups.filter(name__in=group_names)) | u.is_superuser:
                return True
        return False
    return user_passes_test(in_groups)

url(r'^board/$', TemplateView.as_view(template_name='recruit/board.html'), name='recruit_board'),
url(r'^job/$', group_required(['admin', 'job'])(TemplateView.as_view(template_name='recruit/job_detail.html')), name='job_detail'),
url(r'^company/$', group_required(['admin', 'company'])(TemplateView.as_view(template_name='recruit/company_detail.html')), name='company_detail'),