Комментарии 11
В качестве примера ок.
В качестве рабочего кода мне кажется что очень усложнено. Что проще разобрать — ваш код с миксинами или
В качестве рабочего кода мне кажется что очень усложнено. Что проще разобрать — ваш код с миксинами или
def should_be_anonymous(func, url):
def wrapper(request, *args, **kwargs):
if request.user.authenticated:
return HttpResponseRedirect(url)
return func(request, *args, **kwargs)
return wrapper
def auth_check(*args, **kwargs):
anonymous = True
if 'anonymous' in kwargs:
anonymous = kwargs['anonymous']
def wrapper(function, *args, **kwargs):
как-то так. Зачем плодить 100500 декораторов? Ну и туда же можно запихнуть редиректы и прочее.
anonymous = True
if 'anonymous' in kwargs:
anonymous = kwargs['anonymous']
def wrapper(function, *args, **kwargs):
как-то так. Зачем плодить 100500 декораторов? Ну и туда же можно запихнуть редиректы и прочее.
В Джанге уже есть user_passes_test. Поэтому ваш
(Хотя имя
Какие еще условия, кроме проверки пользователя, можно привязать к
should_be_anonymous
реализуется одной строчкой.@user_passes_test(lambda u: u.is_anonymous(), login_url=reverse_lazy('my_view_name'))
def some_view(request, *args, **kwargs):
pass
(Хотя имя
login_url
здесь выбрано не очень удачно).Какие еще условия, кроме проверки пользователя, можно привязать к
request
, я не могу придумать. О, можно проверять метод HTTP, например допускать только POST. Но Джанга у тут уже обо всем позаботилась.К примеру у вас в сессии хранится корзина. И вы должны пустить пользователя на оплату покупки, только при не пустой корзине.
Ну может быть (хотя как он на эту страницу попадет, введет URL руками?). Плюс, таких ситуаций должно быть несколько, тогда подобная заготовка декоратора будет иметь смысл.
Еще пару примеров:
1) Клиент, что бы узнать результат теста и увидеть правильные ответы, должен сначала пройти тест.
2) Мы должны отдавать json массив, только если запрос был отправлен ajax'ом. Иначе мы отдаем HttpResponseBadRequest или возвращаем на главную страницу сайта.
Если подумать, мне кажется, можно найти множество применений.
1) Клиент, что бы узнать результат теста и увидеть правильные ответы, должен сначала пройти тест.
2) Мы должны отдавать json массив, только если запрос был отправлен ajax'ом. Иначе мы отдаем HttpResponseBadRequest или возвращаем на главную страницу сайта.
Если подумать, мне кажется, можно найти множество применений.
По мне, так уже сама абстракция над if-else кажется избыточной:
Если много потрудится, то в пределе всю логику можно выразить в виде функций и их применения, только зачем? Ведь процедурный подход в python прекрасен.
Кстати, в django присутствует схожий по смыслу механизм — стек middleware. Поэтому, в качестве альтернативы пляскам вокруг декораторов, было бы любопытно посмотреть в сторону адаптации его механизмов, под нужны отдельных view.
def wrapper(request, *args, **kwargs):
if not condition_func(request, *args, **kwargs):
return false_func(request, *args, **kwargs)
return view(request, *args, **kwargs)
Если много потрудится, то в пределе всю логику можно выразить в виде функций и их применения, только зачем? Ведь процедурный подход в python прекрасен.
Кстати, в django присутствует схожий по смыслу механизм — стек middleware. Поэтому, в качестве альтернативы пляскам вокруг декораторов, было бы любопытно посмотреть в сторону адаптации его механизмов, под нужны отдельных view.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
«Декораторы проверки» для Views