2010-06-14 9 views

Antwort

4

Aktualisierung: Diese Methode ist seit Django 1.3 veraltet, siehe unten unter Tommy's answer für die Verwendung von Signalen.

Ich war auch auf der Suche nach einer Antwort auf diese und endete einen anderen Weg. Sie können Ihre eigenen Ansichten für das Anmelden und Abmelden verwenden, die einige Aktionen ausführen und dann die Authentifizierungsansichten aufrufen. Zur Anmeldung:

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) 

Und für logout:

def logout(request, *args, **kwargs): 
    do_something() 
    from django.contrib.auth.views import logout as authlogout 
    return authlogout(request, *args, **kwargs) 

Sie tun können, was die Verarbeitung in Ihrer benutzerdefinierten Ansichten anstelle der do_something Platzhalter mögen, wie Signale aussendet, Anmeldung Login und log -out Zeiten usw.

Schließlich vergessen Sie nicht, Ihre urls.py zu aktualisieren, um auf Ihre benutzerdefinierten Ansichten zu zeigen.

Ich bin mir nicht sicher, wie ein benutzerdefiniertes Auth-Backend Abmeldeereignisse behandeln kann, als ich schließlich aufgab und dies stattdessen versuchte. Zusätzlich hat dieser Ansatz den Vorteil, das Objekt request anstelle nur des Benutzers verfügbar zu machen.

+0

auch: den Benutzer bei der Anmeldung eingewickelt Ansicht zuzugreifen, verwenden Sie 'form.get_user()' , da das 'request' Objekt' AnonymousUser' zurückgibt. – rlafuente

+1

Als verspätete Folge, und wie von Tommy bemerkt, fügte Django 1.3 [Login- und Logout-Signale] (https://docs.djangoproject.com/en/dev/topics/auth/#login-and-logout-signals) hinzu Die Auth-Anwendung bietet eine einfache Lösung für die Frage und macht diese Methode obsolet. – rlafuente

+0

Doh, bemerkte gerade, dass Federico das auch erwähnte. Prost alles! – rlafuente

6

Django hat leider keine Signale auf, die Ereignisse senden .... Aber Sie könnten Ihre eigenen AuthorizationBackend machen, dass Sie so tun können:

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) 

es Damit Sie AUTHENTICATION_BACKENDS = (myapp.mymodule.AuthSignalBackend',) in Ihrem setzen haben settings.py!

2

Ich habe gerade dieses Thema, wenn nach einer Lösung gesucht, damit andere auch vielleicht ...

Lazerscience Antwort so weit sieht gut aus, aber ich merke auch, dass der Django Kern Devs a patch angenommen hat, dass ein Signal auf Protokoll verursachen Ein-/Ausloggen.

Dies könnte eine elegantere Lösung sein, sobald es zu einer offiziellen Django-Veröffentlichung wird.

Und als Referenz, die Dokumente auf Signals.

+1

An- und Abmeldesignale sind Teil der offiziellen Version ab 1.3: [Referenz] (https://docs.djangoproject.com/en/1.3/topics/auth/#login-and-logout-signals) – Federico

4

Ab Django 1.3 generiert das Auth-Framework Signale für das Anmelden und Abmelden, die verwendet werden können, um Ihren eigenen Hook bereitzustellen.

Sie haben Ihre Funktion zum django.contrib.auth.signals.user_logged_in Signal verbinden, wie:

def fun(sender, **kwargs): 
    print "do your custom stuff here" 

from django.contrib.auth.signals import user_logged_in 
user_logged_in.connect(fun)