2010-06-14 132 views

回答

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指向您的自定义视图。

我不确定自定义auth后端如何处理注销事件,因为我最终放弃了这一点,并尝试使用它。另外,这种方法的优点是可以提供request对象而不仅仅是用户。

+0

另外:访问用户在登录包裹查看,使用'form.get_user()' ,因为'request'对象将返回'AnonymousUser'。 – rlafuente 2010-06-23 10:53:24

+1

作为一个迟来的后续,正如汤米所说,Django 1.3添加了[登录和注销信号](https://docs.djangoproject.com/en/dev/topics/auth/#login-and-logout-signals)到auth应用程序,为问题提供了一个直接的解决方案,并使此方法过时。 – rlafuente 2012-05-07 22:39:38

+0

Doh,刚刚注意到Federico也提到了这一点。干杯! – rlafuente 2012-05-07 22:40:17

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中!

2

我刚刚发现这个线索寻找一个解决方案时,让其他人可能太...

Lazerscience答案看起来不错,到目前为止,但我也注意到,Django的核心开发者已经接受a patch,将导致信号上的日志-in /注销。

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

并仅供参考,关于Signals的文档。

+1

登录和注销信号是1.3版的官方发布的一部分: [参考资料](https://docs.djangoproject.com/en/1.3/topics/auth/#login-and-logout-signals) – Federico 2011-07-14 14:09:10

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)