Подтвердить что ты не робот

Login_required decorator в джанго

Есть ли разница в использовании login_required decorator в urls.py и в views.py? Если я поставлю эту строку:

url(r'^add/$', login_required(views.add_media), name = 'add_media_action')

в urls.py я получу тот же эффект, что и украшение функции add_media в views.py:

@login_required
def add_media(request):
    ...
4b9b3361

Ответ 1

В Python декоратор - это функция, которая принимает функцию в качестве аргумента и возвращает украшенную функцию. Синтаксис @login_required можно перевести на:

def add_media(request):
  ...
add_media = login_required(add_media)

Итак, если вы примените декоратор вручную (как в вашем первом фрагменте), он должен сгенерировать тот же эффект.

Подход в вашем первом фрагменте полезен, если вы хотите использовать как украшенные, так и невыделенные версии вашего представления.

Ответ 2

Как отмечали другие, они действительно эквивалентны. Еще две вещи, которые следует учитывать, если вы хотите использовать этот подход:

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

  • Поскольку вы применяете безопасность в файле urls, кто-то может ошибочно добавить еще один URL-адрес, указывающий на ту же функцию, но забудьте обернуть функцию в login_required, что приведет к дыре в безопасности.

Надеюсь, что это поможет.

Ответ 3

Да, они одинаковы. Декораторы представляют собой синтаксический сахар для обертывания функции в другой. Поэтому в любом случае вы обертываете login_required вокруг views.add_media.