2012-10-05 10 views
5
$.ajax({ 
    url:'/', 
    type: "POST", 
    data: {name: 'name', age: 'age'}, 
    success:function(response){}, 
    complete:function(){}, 
    error:function (xhr, textStatus, thrownError){} 
}); 

Und in views.py:Django jQuery post request

class SomeView(generic_views.TemplateView): 
    template_name = 'something.html' 

    def get(self, request, *args, **kwargs): 
     ...something... 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     name = request.POST['name'] 
     age = request.POST['age'] 
     ...something... 

Und ich: [05/Okt/2012 00.03.58] "POST/etwas/HTTP/1.1" 403 2294

Ich möchte diese Daten (Name und Alter) über jQuery an diese Post-Funktion in "SomeView" senden. Dies ist die gleiche Ansicht wie die geladene Vorlage, nur der Anforderungstyp ist anders. Bei get() lädt die Vorlage und bei post sollte die post() -Funktion aufgerufen werden. Ist es möglich? Ich habe andere Fragen überprüft und diese Lösung bekommen. Es sollte funktionieren. Was mache ich falsch?

Antwort

8

Die Antwort auf Ihre Frage, was Sie falsch machen, ist : nicht viel!

Django gibt eine 403-Antwort (Forbidden) zurück, wenn eine eingehende POST-Anfrage fehlschlägt Csrf prüft. Sie können dies tun durch sind jQuery ajaxSetup, Code-Snippets here

Der Grund gefunden, dass diese Arbeit auf einer GET-Anforderung der Fall ist, ist einfach, dass GET-Anfragen durch die csrf Middleware nicht überprüft werden.

Wie es aussieht, erstellen Sie hier ein Formular, eine andere Sache, die zu berücksichtigen ist, ist die Verwendung von klassenbasierten Formularen. Sie handhaben Get/Post und auch die Validierung von Parametern für Sie. Sehr gepflegt. Insbesondere wenn Sie Formulare zum Bearbeiten/Erstellen/Löschen von Modellinstanzen erstellen, können Sie die Möglichkeiten von ModelForms und CreateViews nutzen. Sehr gepflegt.

Es kann einige Zeit dauern, bis diese generischen klassenbasierten Ansichten in den Vordergrund treten. Aber es ist es sehr wert.

+0

Ja auf anderen Seiten, die ich Formview verwende. Aber in diesem Fall kann ich nicht (lange Geschichte). :) Jetzt funktioniert die Sache, aber im Terminal sehe ich [05/Oct/2012 15:08:11] "POST/etwas/HTTP/1.1" 500 9499 – premik91

+0

500 ist einfach ein Serverfehler. Dies kann auf einen Python-Fehler in Ihrer Post-Methode zurückzuführen sein. –

+0

Aber das sollte sich zeigen, da ich im Debug-Modus bin, oder? – premik91

6

Sie müssen ein CSRF-Token (Cross-Site Request Forgery) in Ihren Ajax-Aufruf aufnehmen. Dies ist gut dokumentiert: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

oder, wenn Sie eine schnelle Lösung verwenden möchten, verwenden Sie die @csrf_exempt Dekorateur für Ihre Ansicht:

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    ... 
+0

Danke man :) – premik91

2

Innerhalb einer Django-Vorlage Sie diese hinzufügen können ...

{% csrf_token %} 

, die wie folgt zu Ihrer Seite html führt zu dieser Ausgabe ...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz"> 

Dann Javascript verwenden Sie einfach diese finden Eingabe und erhalten Sie ihren Wert - so etwas wie dieses nicht jQuery Beispiel ...

var el = document.getElementsByName("csrfmiddlewaretoken"); 
csrf_value = el[0].getAttribute("value"); 

Schließlich fügen Sie die c srf_value auf Ihre jQuery AJAX Post Form Datenleitung wie so ...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value}, 

Hier ist ein Arbeits jsFiddle Konzept: https://jsfiddle.net/vdx1Lfpc/18/