2017-07-19 15 views
1

Paramètres:Comment utiliser django-tastypie avec django-axes

django==1.8 
django-tastypie==0.13 
django-axes==2.3 

J'ai des ressources de connexion par tastypie ce qui ressemble à ci-dessous

from django.contrib.auth import login 


class LoginResource(Resource): 
    class Meta: 
     resource_name = 'login' 
     allowed_methods = ['post'] 

    def obj_create(self, bundle, **kwargs): 
     form = AuthForm(data=bundle.data) 
     if form.is_valid(): 
      request.session.set_expiry(0) 
      if form.get_user(): 
       login(bundle.request, form.get_user()) 
       raise ImmediateHttpResponse(response=HttpResponse(status=200)) 
     raise ImmediateHttpResponse(response=http.HttpBadRequest(status=400)) 

Et je ne peux pas comprendre comment consigner ces tentatives de connexion dans les axes django.

Répondre

0

En regardant at the code from django-axes nous pouvons voir qu'il utilise un décorateur appelé watch_login pour fournir sa fonctionnalité. Pour enregistrer les tentatives de connexion à l'aide de votre ressource, vous devez appliquer ce décorateur au view qui est appelé lorsque l'utilisateur tente de se connecter à l'aide de cette ressource donnée.

Basé sur le code tastypie, vous pouvez remplacer la méthode prepend_urls de votre ressource et ajouter votre URL. Comme cela (ce qui est juste un exemple, n'a pas été testé):

def prepend_urls(self): 
    from axes.decorators import watch_login 
    urls = [ 
     url(r"^(?P<resource_name>%s)/login$" % (self._meta.resource_name,), watch_login(self.wrap_view('dispatch_list')), name="login-enpoint") 
    ] 
    return urls 
1

Ma solution était suivante: Je vous écris vue de connexion personnalisé dans views.py

from django.contrib.auth.views import login 


def core_login(request, *args, **kwargs): 
    kwargs["authentication_form"] = AuthForm 
    return login(request, *args, **kwargs) 

Et en ressources tastypie:

from core.views import core_login 

class LoginResource(Resource): 
    class Meta: 
     resource_name = 'login' 
     allowed_methods = ['post'] 

    def obj_create(self, bundle, **kwargs): 
     bundle.request.POST = bundle.data 
     if core_login(bundle.request).status_code == 302: 
      raise ImmediateHttpResponse(response=HttpResponse(status=200)) 
     raise ImmediateHttpResponse(response=http.HttpBadRequest(status=400))