2010-06-14 91 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)