Как я добавляю рычаги к Администратору Django, такому, что я могу выполнить функцию, когда пользователь входит в систему или?
Обновление: Этот метод устарел, начиная с 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!