В моем приложении 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?
Можно импортировать функцию, необходимую для входа в систему, и применить ее к общему представлению:
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'}),
)
как упоминается здесь .
Один из подходов - обернуть представления, которые вы не писали.
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'))