2009-05-20 2 views
16

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

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

в urls.py будет я достичь того же эффекта, как декорирования add_media функцию в views.py:

@login_required 
def add_media(request): 
    ... 

ответ

29

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

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

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

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

+9

+1 особенно для примечания в последнем предложении. –

3

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

8

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

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

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

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

Смежные вопросы