Django: повторно использовать login_required декоратор внутри других декораторов - PullRequest
6 голосов
/ 01 марта 2012

Согласно одному из комментариев в https://stackoverflow.com/a/8715790/210481,, с которым я согласен, нам следует избегать нескольких декораторов, если один зависит от другого.

Таким образом, в примере, если у нас есть декоратор "active_required" для активных пользователей, нам не нужно использовать и active_required, и login_required для одного представления.

У нас должен быть "login_required" декоратор, "как-то" называемый внутри "active_required".

Возможно ли это сделать с помощью стандартного декоратора login_required, который поставляется с django?

Мои требования: 1) если пользователь не аутентифицирован, я должен перенаправить его на LOGIN_URL 2) если пользователь прошел проверку подлинности (прошел login_required), но не активен, я должен перенаправить его на страницу, чтобы «повторно активировать» его учетную запись 3) если пользователь аутентифицирован и активен, он может получить доступ к представлению

Заранее спасибо

1 Ответ

8 голосов
/ 02 марта 2012

Обдумывая ваш вопрос, я обнаружил, что проще сначала создать простой active_required декоратор. Это очень просто, потому что мы можем использовать функцию user_passes_test в django.contrib.auth.decorators.

Затем вопрос меняется на «как мне объединить login_required и active_required в один декоратор?» Нам нужно определить функцию, которая:

  1. принимает функцию представления в качестве аргумента
  2. применяет к нему оба декоратора для создания новой функции просмотра
  3. возвращает новую функцию просмотра

Собрав все вместе, вы получите следующее:

from django.contrib.auth.decorators import user_passes_test, login_required

active_required = user_passes_test(lambda u: u.is_active, login_url=REACTIVATE_URL)

def active_and_login_required(view_func):
    decorated_view_func = login_required(active_required(view_func))
    return decorated_view_func
...