2010-10-07 4 views
1

J'ai une application django dont les vues utilisent actuellement le décorateur @login_required.Django: Ajout d'une logique supplémentaire à la méthode de connexion?

Quel est le moyen le plus simple/le meilleur d'ajouter une logique supplémentaire au système de connexion? Je veux ajouter des contraintes supplémentaires telles que leur abonnement au site est toujours valide. Si elle a expiré, je veux les diriger vers une page qui indique que leur abonnement a expiré et qu'ils devront payer à nouveau.

Idéalement, un signal serait génial, mais je ne trouve aucun type de signal post_login. A défaut, je suppose que mes options sont d'écrire mon propre gestionnaire de connexion, ou d'avoir une sorte de méthode check_valid_user() que j'appelle dans chacune de mes vues. Je ne favorise pas ce dernier car un autre dev pourrait oublier de l'ajouter, et les utilisateurs pourraient obtenir du contenu gratuitement.

Quelle approche recommanderiez-vous?

Merci

Répondre

2

Vous pouvez écrire propre vue de connexion ou mieux propre authbackend (deuxième exemple).

from django.contrib.auth.views import login as core_login 

#myapp/views.py 
@ratelimit_post(minutes = 1, requests = 4, key_field = 'username') 

def login(request,template_name): 
    from django.contrib.auth import authenticate 
    user = authenticate(username='john', password='secret') 
    template_name = "template_name" + "aaaaa" 
    return core_login(request, template_name) 


#myapp/ursl.py 
#override default url 
    ... 
    (r'^accounts/login/$', 'myapp.views.login', {'template_name': 'profile/login.html'}), 
    ... 



#backends/authemailbackend.py 
from django.contrib.auth import authenticate 
user = authenticate(username='john', password='secret') 
from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 
from django.forms.fields import email_re 

class EmailBackend(ModelBackend): 
    def authenticate(self, username=None, password=None): 
     if email_re.search(username): 
      try: 
       user = User.objects.get(email=username) 
       if user.check_password(password): 
        return user 
      except User.DoesNotExist: 
       return None 
     return None 
~                                              
~       

#settings.py 
AUTHENTICATION_BACKENDS = (
    "myapp.backends.authemailbackend.EmailBackend", 
    "django.contrib.auth.backends.ModelBackend", 
) 
Questions connexes