@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