Django:在URL调度程序中应用权限?

时间:2010-08-11 17:39:53

标签: django django-urls django-permissions

在我的Django应用程序中,我有一些用户访问某些视图所需的权限(使用django.contrib.auth)。这可以正常工作,在我的视图函数上使用@permission_required装饰器。

但是,我的某些网址会解析为我未编写的视图,例如内置的django.contrib.auth.views.password_change,如下面的urls.py所示:

urlpatterns = patterns(
 (r'^$', "users.views.index"),
 (r'^password_change/$', 'django.contrib.auth.views.password_change'))

在这种情况下,我无处可以应用我的@permission_required装饰者 - 或者我?有没有办法在URL调度程序级别应用权限限制?

4 个答案:

答案 0 :(得分:9)

可以导入登录所需功能并将其应用于通用视图:

from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
    (r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}),
    )

提到here

答案 1 :(得分:9)

装饰器是包装另一个函数的函数的一个奇特的词。 login_required是视图的包装函数,而permission_required构造视图的包装器。换句话说,login_required本身就是一个装饰者,而permission_required(perm)构造了一个装饰者。

from django.conf.urls import url
from django.contrib.auth.decorators import login_required, permission_required

urlpatterns = [
    url(r'^public/', myview),

    url(r'^users_only/', 
        login_required(myview)),

    url(r'^users_with_perms/',
        permission_required('myapp.view_mymodel', login_url='login')(myview)),

    url(r'^login_page/', myloginview, name='login'),
]

答案 2 :(得分:-1)

一种方法是包装你没写的视图。

from django.contrib.auth.views import password_change

@permission_required('my_perm')
def wrapper(*args, **kwargs):
    return password_change(*args, **kwargs)

#URLs
urlpatterns = patterns(
  (r'^$', "users.views.index"),
  (r'^password_change/$', 'wrapper'))

答案 3 :(得分:-2)

我有关于Django URL解析器的little hack,您可以在URL调度级别应用装饰器:

from django_url_decr import url_decr
from django.contrib.auth.decorators import login_required

urlpatterns = patterns(''
                       url_decr(r'^users/',
                                include('users.urls'),
                                decr=login_required))