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)
遗憾的是,Django没有发出任何关于这些事件的信号。。。。但您可以创建自己的自定义授权后端,使您能够这样做:
要启用它,必须将
AUTHENTICATION_BACKENDS = (myapp.mymodule.AuthSignalBackend',)
放在settings.py中!更新:此方法自Django 1.3以来已过时,有关使用信号的信息,请参见下面的Tommy's answer。
我也在寻找这个问题的答案,结果却走了另一条路。您可以使用自己的视图进行登录和注销,这些视图执行一些操作,然后调用auth视图。对于登录:
对于注销:
您可以在自定义视图中执行任何您喜欢的处理,而不是使用do_something占位符,例如发出信号、登录和注销时间等
最后,不要忘记更新
urls.py
以指向自定义视图。我不确定自定义身份验证后端如何处理注销事件,因为我最终放弃了这一点,转而尝试了这一点。另外,这种方法的优点是可以使用
request
对象,而不仅仅是用户。从Django 1.3开始,auth框架生成登录和注销信号,这些信号可用于提供您自己的钩子。
您必须将函数连接到django.contrib.auth.signals.user_logged_-in信号,如:
相关问题 更多 >
编程相关推荐