Получить логин в декораторе Django login_required - PullRequest
0 голосов
/ 09 июля 2020

В моем django views.py есть 75 функций , и для каждой функции я использую @ login_required декоратор, и я хочу захватить имя пользователя , когда кто-то нажимает соответствующую функцию.

Я могу получить это, используя request.user.username , но я должен написать эту строку во всех 75 функциях что является избыточным ... Есть ли способ получить / распечатать имя пользователя в самом декораторе @login_required по умолчанию, чтобы я мог пропустить запись той же строки во всех функциях.

Ниже приведен фрагмент для декоратора @login_required .

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    """
    Decorator for views that checks that the user is logged in, redirecting
    to the log-in page if necessary.
    """
    actual_decorator = user_passes_test(
        lambda u: u.is_authenticated,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

Примечание : - Под захватом, я имею в виду, что я хочу сделать logger.info (request.user.username) или получить имя пользователя другими способами

1 Ответ

0 голосов
/ 09 июля 2020

Пара способов go об этом, которые сразу выделяются ..

Вы можете написать свой собственный декоратор:

def custom_login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    """
    Decorator for views that checks that the user is logged in, redirecting
    to the log-in page if necessary.
    """
    actual_decorator = user_passes_test(
        lambda u: u.is_authenticated,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if request.user.username: #probably better ways to write this
        logger.info(request.user.username)
    elif function:
        return actual_decorator(function)
    return actual_decorator

Вы можете использовать CBV s и Mixin s (один из моих любимых способов написания кода многократного использования) и переопределить метод LoginRequiredMixin * dispatch() (я считаю, что это лучший способ переопределения):

class LoginRequiredMixin(LoginRequiredMixin):
    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            logger.info(request.user.username)
        else: 
            pass
        return super().dispatch(request, *args, **kwargs)

Вам нужно будет проверить, правильно ли написан этот код. Я написал это быстро ...

Кроме того, третий способ - написать настраиваемое промежуточное ПО , что, вероятно, является лучшим вариантом из всех 3.

...