10

在我的 Django 应用程序中,我拥有用户访问某些视图所需的某些权限(使用django.contrib.auth)。这很好用,@permission_required在我的视图函数上使用装饰器。

但是,我的一些 URL 解析为我没有编写的视图,例如内置的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

4 回答 4

17

装饰器是包装另一个函数的函数的一个花哨的词。login_required是视图的包装器函数,同时permission_required为您的视图构造包装器。换句话说,login_requiredis 本身就是一个装饰器,并且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'),
]
于 2015-07-15T07:51:56.130 回答
10

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

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'}),
    )

正如这里提到的。

于 2010-08-11T17:47:19.177 回答
-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'))
于 2010-08-11T17:54:26.520 回答
-2

我对 Django URL 解析器有一点小技巧,您可以在 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))
于 2014-11-02T09:01:24.967 回答