2017-07-19 2 views
1

Einstellungen verwenden:Wie django-tastypie mit django-Achsen

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

Ich habe Login Ressource durch tastypie was wie

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)) 

unten schaut Und ich, wie nicht herausfinden kann protokollieren Sie diese Anmeldeversuche in Django-Achsen.

Antwort

0

Mit Blick auf at the code from django-axes können wir sehen, dass es einen Dekorateur namens watch_login verwendet, um seine Funktionalität bereitzustellen.

Um die Anmeldeversuche mit Ihrer Ressource zu protokollieren, müssen Sie diesen Decorator auf die view anwenden, die aufgerufen wird, wenn der Benutzer versucht, sich mit dieser gegebenen Ressource anzumelden.

Basierend auf tastypie Code, können Sie prepend_urls Methode Ihrer Ressource überschreiben und Ihre URL hinzufügen. Wie folgt aus (dies ist nur ein Beispiel, wurde nicht getestet):

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

Meine eigene Lösung wurde als nächstes: Ich benutzerdefinierte Login-Ansicht in views.py

from django.contrib.auth.views import login 


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

Und in tastypie Ressource schreiben:

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))