Взлом 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.
И для справки, документы по сигналам.