Pull to refresh

Comments 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
Наверно поддержу. Код на python должен быть простым и понятным. А тут задумываться нужно, где, что как и почему.
Мне больше нравится код автора статьи — он нисколько не сложнее, а дает хорошую гибкую базу для реализации поведений сложнее, чем в этом примере.
def auth_check(*args, **kwargs):
anonymous = True
if 'anonymous' in kwargs:
anonymous = kwargs['anonymous']

def wrapper(function, *args, **kwargs):

как-то так. Зачем плодить 100500 декораторов? Ну и туда же можно запихнуть редиректы и прочее.
UFO just landed and posted this here
UFO just landed and posted this here
В Джанге уже есть 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 или возвращаем на главную страницу сайта.

Если подумать, мне кажется, можно найти множество применений.
По мне, так уже сама абстракция над if-else кажется избыточной:
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.
Sign up to leave a comment.

Articles