2010-08-11 2 views
7

В моем приложении Django у меня есть определенные разрешения, необходимые пользователям для доступа к определенным представлениям (с использованием django.contrib.auth). Это отлично работает, используя декоратор @permission_required на моих функциях просмотра.Django: Применение разрешений в диспетчере URL?

Однако, некоторые из моих 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-адресов?

ответ

8

Можно импортировать функцию входа требуется, и применить его к общей точки зрения:

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.

+0

Как бы вы использовали 'permission_required' таким же образом? В частности, как бы вы передали ему аргумент имени разрешения? –

+0

@Manoj: ознакомьтесь с этим разделом документации: http://docs.djangoproject.com/en/dev/topics/auth/#limiting-access-to-generic- рассматривает идею написать тонкую обертку (с allow_required decorator) вокруг общего представления и указать ваш urlconf на эту оболочку ... – Hoff

+0

Вот что я сделал в своем ответе. Просто хотел знать, есть ли какой-нибудь другой способ. Благодарю. –

-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')) 
-1

У меня есть little hack о URL распознаватель Django, вы можете применить декоратор на уровне отправки 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)) 
5

декоратор причудливое слово для функции, которая оборачивает другую функцию. 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'), 
] 
+0

вы лучшие! Этот ответ более понятен выбранному –

Смежные вопросы