黑客Django Admin,挂钩登录/注销

时间:2010-06-14 13:27:40

标签: python django django-admin

如何向Django Admin添加钩子,以便我可以在用户登录或注销时执行某个功能?

4 个答案:

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

我在搜索解决方案时发现了这个帖子,所以其他人也可能......

Lazerscience答案到目前为止看起来还不错,但我也注意到Django核心开发者已接受a patch,这会导致登录/注销信号。

一旦它成为正式的Django版本,这可能是一个更优雅的解决方案。

供参考,Signals上的文档。