黑客Django管理员,用于登录/登录的钩子

2024-05-13 00:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

如何向Django管理员添加钩子,以便在用户登录或注销时执行函数?


Tags: django函数用户管理员钩子
3条回答

遗憾的是,Django没有发出任何关于这些事件的信号。。。。但您可以创建自己的自定义授权后端,使您能够这样做:

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以来已过时,有关使用信号的信息,请参见下面的Tommy's answer

我也在寻找这个问题的答案,结果却走了另一条路。您可以使用自己的视图进行登录和注销,这些视图执行一些操作,然后调用auth视图。对于登录:

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 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)

相关问题 更多 >