Взлом Django Admin, хуки для входа / выхода - PullRequest
5 голосов
/ 14 июня 2010

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

Ответы [ 4 ]

6 голосов
/ 14 июня 2010

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!

4 голосов
/ 29 августа 2011

Начиная с 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)
4 голосов
/ 23 июня 2010

Обновление: Этот метод устарел с 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 вместо просто пользователя.

2 голосов
/ 19 декабря 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...