在我的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调度程序级别应用权限限制?
答案 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))