Взлом Django Admin, хуки для входа / выхода

Как добавить хуки для администратора Django, чтобы я мог выполнять функцию при входе или выходе пользователя?

4 ответа

Решение

Обновление: этот метод устарел с Django 1.3, см . Ответ Томми ниже для использования сигналов.

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

def login(request, *args, **kwargs):
    from django.contrib.auth.forms import AuthenticationForm
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            # login successful
            do_something()
    from django.contrib.auth.views import login as authlogin
    return authlogin(request, *args, **kwargs)

И для выхода:

def logout(request, *args, **kwargs):
    do_something() 
    from django.contrib.auth.views import logout as authlogout
    return authlogout(request, *args, **kwargs)

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

Наконец, не забудьте обновить свой urls.py чтобы указать на ваши собственные взгляды.

Я не уверен, как пользовательский аутентификационный бэкэнд может обрабатывать события выхода из системы, так как я в конце концов отказался от этого и попробовал вместо этого. Кроме того, этот подход имеет то преимущество, что делает доступным request объект вместо просто пользователя.

К сожалению, Django не посылает никаких сигналов об этих событиях.... Но вы можете создать свой собственный AuthorizationBackend, который позволит вам сделать это:

from django.dispatch import Signal

post_login = Signal(providing_args=['user'])

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class AuthSignalBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                post_login.send(sender=None, user=user)
                return user
        except User.DoesNotExist:
            return None


def login_handler(sender, **kwargs):
    print "logging in..."        
post_login.connect(login_handler)

Чтобы включить его, вы должны поставить AUTHENTICATION_BACKENDS = (myapp.mymodule.AuthSignalBackend',) в твоих settings.py!

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

Вы должны подключить свою функцию к сигналу django.contrib.auth.signals.user_logged_in, например:

def fun(sender, **kwargs):
     print "do your custom stuff here"

from django.contrib.auth.signals import user_logged_in
user_logged_in.connect(fun)

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

Ответ Lazerscience пока выглядит хорошо, но я также заметил, что разработчики ядра Django приняли патч, который вызовет сигнал при входе / выходе из системы.

Это может быть более элегантным решением, если оно станет официальным релизом Django.

И для справки, документы по сигналам.

Другие вопросы по тегам