Джанго: Применение разрешений в диспетчере URL? - PullRequest
8 голосов
/ 11 августа 2010

В моем приложении 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 ]

9 голосов
/ 15 июля 2015

Декоратор - это модное слово для функции, которая оборачивает другую функцию.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'),
]
9 голосов
/ 11 августа 2010

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

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

как упомянуто здесь .

0 голосов
/ 02 ноября 2014

У меня есть небольшой взлом о распознавателе 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))
0 голосов
/ 11 августа 2010

Один из подходов - обернуть взгляды, которые вы не написали.

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