如何向Django Admin添加钩子,以便我可以在用户登录或注销时执行某个功能?
答案 0 :(得分:6)
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!
答案 1 :(得分:4)
更新:自Django 1.3以来,此方法已过时,请参阅下面的Tommy's answer以了解使用信号。
我也在寻找答案,最后走另一条路。您可以使用自己的视图进行登录和注销,执行某些操作然后调用身份验证视图。登录:
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 :(得分:4)
从Django 1.3开始,auth框架会生成登录和注销信号,可以用来提供自己的钩子。
您必须将您的函数连接到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)
答案 3 :(得分:2)