@login_required в зависимости от настроек?

Хотя я ожидал, что ответ на этот вопрос будет дан где-нибудь на StackOverflow, я его не нашел, поэтому прошу прощения, если это дубликат.

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

Я не против поместить в представление код для проверки настройки и вызова redirect("account_login"), если она включена. И, полагаю, передача request.get_full_path() в качестве параметра next, вероятно, сработает.

Но перенаправление на вход в систему и обратно кажется достаточно распространенным случаем использования, чтобы я мог ожидать, что для этого будет использоваться какая-нибудь элегантная функция в django.contrib.auth или django-allauth, или что будет легко создать свой собственный условный декоратор @login_required. Я что-то упускаю?

Спасибо.

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

from functools import wraps
from django.conf import settings
from django.shortcuts import redirect
from django.contrib.auth.views import redirect_to_login

def login_required_if_setting(setting_name):
    """
    Conditionally requires login for a view based on a Django setting.
    Example usage:
        @login_required_if_setting("REQUIRE_LOGIN_FOR_DASHBOARD")
    """
    def decorator(view_func):
        @wraps(view_func)
        def _wrapped_view(request, *args, **kwargs):
            require_login = getattr(settings, setting_name, False)
            if require_login and not request.user.is_authenticated:
                return redirect_to_login(request.get_full_path())
            return view_func(request, *args, **kwargs)
        return _wrapped_view
    return decorator
Вернуться на верх