Как мне написать декоратор для моего представления Django / Python? - PullRequest
4 голосов
/ 01 декабря 2010

Вот мой взгляд.По сути, он возвращает разные ответы в зависимости от того, вошел он в систему или нет.

@check_login()
def home(request):
    if is_logged_in(request): 
        return x
    else:
        return y

Вот мой код декоратора.Я просто хочу проверить, есть ли в запросе заголовки, и если так, войдите в него.

#decorator to log the user in if there are headers
def check_login():
    def check_dec(func):
        if request.META['username'] == "blah":
            login(request, user)

    return check_dec

Проблема в том, что ... я не знаю, как написать правильный декоратор в этом случае !!!Каковы аргументы?Какие функции?Как?

Ответы [ 3 ]

11 голосов
/ 01 декабря 2010

Используйте только @check_login вместо check_login() - иначе ваш декоратор должен вернуть декорацию, как вы делаете home = check_login()(home)

Вот пример декоратора:

def check_login(method):
    @functools.wraps(method)
    def wrapper(request, *args, **kwargs):
        if request.META['username'] == "blah"
            login(request, user) # where does user come from?!
        return method(request, *args, **kwargs)
    return wrapper

Этодекоратор вызовет выполнение вашей функции входа в систему, если в поле имени пользователя установлено значение «бла», а затем вызовет оригинальный метод.

3 голосов
/ 01 декабря 2010

Простой декоратор - это просто функция, которая принимает функцию или класс и возвращает что-то еще (обычно того же типа, но это не обязательно). Параметризованный декоратор - это функция, которая возвращает декоратор.

Итак, имея в виду, мы создаем замыкание и возвращаем его:

def check_login(func):
  def inner(request, *args, **kwargs):
    if request.META['username'] == 'blah':
      login(request, user) # I have no idea where user comes from
    func(request, *args, **kwargs)
  return inner
2 голосов
/ 01 декабря 2010

Вот декоратор, который я написал, чтобы проверить, входит ли пользователь в определенную группу.Он показывает немного больше.

https://github.com/mzupan/django-decorators/blob/master/auth.py

Вы используете его как

@group_required(["group1", "group2"])
def show_index(request):
    view_code_here

Пользователь может быть в группе group1 или group2, если он не получит404 стр.

...