Нужно было написать anonymous_required декоратор, так вот пришлось помучаться рабочий вариант выглядит так
def anonymous_required(redirect_to = None):
def decor(view_function):
@wraps(view_function)
def func(request, *args, **kwargs):
if request.user is None or not request.user.is_authenticated():
return view_function(request, *args, **kwargs)
return redirect(to = redirect_to)
return func
return decor
ключевой момент тут в использовании wraps, если его не будет все падет прахом и вы будете получать NoMatchReserve во всяком случае так было у меня использую Django 1.65. Так вот возникает вопрос скорее в общеобразовательных целях. Как сделать декоратор но используя класс, т.к. ума не приложу что нужно врапать. Вот пример
class AnonymousRequired(object):
def __init__(self, view_function, redirect_to):
self.view_function = view_function
self.redirect_to = redirect_to
def __call__(self, request, *args, **kwargs):
if request.user is None or not request.user.is_authenticated():
return redirect(to = self.redirect_to)
return self.view_function(request, *args, **kwargs)
Может у кого есть в загашнике и не жалко добротных объяснений про декораторы, саму суть я понимаю, но не могу въехать как вложенная функция получает ссылку на декорируемую при том что самая верхняя функция не принимает в аргументе декорируемую. Пример
def outer(some_arg = None):
def inner(wrapped_function):
print some_arg
return wrapped_function
return inner
Updated 24 June 2014, 20:56 by gingray.