2016-03-29 7 views
3

Ich bilde Ajax-Aufruf wie folgt:Verboten (CSRF-Token fehlen oder falsch sind.):

var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken': '{{ csrf_token }}'}; 
    $.ajax({ 
     type: 'POST', 
     url:"/issuebook", 
     data:data_dict, 
     processData: false, 
     contentType: false, 
     success:function(response) 
     { 
     } 
    }); 

urls.py ist:

urlpatterns = [ 
url(r'^$',views.checkLogin,name='checklogin'), 
url(r'^mylibrary/(?P<pk>\d+)/(?P<user_name>[\w\-]+)$',login_required(views.MyLibrary.as_view()),name='mylibrary'), 
url(r'^centrallibrary/(?P<pk>\d+)/(?P<user_name>[\w\-]+)$',login_required(views.CentralLibrary.as_view()),name='centrallibrary'), 
url(r'^issuebook$',login_required(views.IssueBookView.as_view()),name='issuebook'), 

]

I „bin immer verboten (CSRF-Token fehlt oder ist falsch.):/Issuebook "Fehler beim Ajax-Aufruf.

Die csrf Token in Ajax-Aufruf wird immer wiedergegeben als:

var data_dict = {'user':{{ user.id }}, 'bookId':that.id, 'csrfmiddlewaretoken':'fSSdu8dJ4FO6FvDz8eU5ISzOewRYyGbC'}; 
        $.ajax({ 
         type: 'POST', 
         url:"/issuebook", 
         data:data_dict, 
         contentType: false, 
         success:function(response) 
         { 
         } 
        }); 
+0

Sie haben gerade die Zeichenfolge '{{csrf_token}} '' als 'csrfmiddlewaretoken' übergeben, und Ihr Ajax-Aufruf kann sie nicht mit der relativen abgleichen. Stattdessen können Sie den Hash-Wert von 'csrf' Token manuell von Ihrem HTML in Ihrer Anruffunktion abrufen. – Kasramvd

+0

Fügen Sie die gerenderte HTML-Vorlage auch in die Frage ein. – v1k45

+0

@ v1k45 Ich habe das gerenderte {{csrf_token}} in der bearbeiteten Frage hinzugefügt. Abgesehen davon tue ich nur einige String-Werte in der Vorlage, die gut funktioniert – ankit

Antwort

2

Dieser Fehler wird durch processData und contentType Optionen in Ihrer Ajax-Funktion verursacht wird. Durch das Entfernen dieser beiden Optionen wird das Problem behoben.

Erläuterung: Die Argumente für Django gesendet werden müssen, wie mit Content-Type application/x-www-form-urlencoded urlencoded. Wenn Sie jedoch processData: false setzen, werden die POST-Parameter nicht codiert, und contentType: false sendet die AJAX-POST-Anforderung als text/plain.