2016-03-29 11 views
3

творю Ajax вызова, как показано ниже:Forbidden (CSRF маркер отсутствует или неверен.):

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 является:

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

]

Я получаю «Запрещенный (Недопустимый токен CSRF или неверный.):/Issuebook "при вызове ajax.

CSRF токен в Ajax вызова становится визуализируется как:

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

Вы просто передали строку '' {{csrf_token}} '' как 'csrfmiddlewaretoken', и ваш вызов ajax не может сравниться с относительным. Вместо этого вы можете получить хэш-значение маркера 'csrf' вручную из своего html в вашей функции вызова. – Kasramvd

+0

Добавьте отображаемый HTML-шаблон в этот вопрос. – v1k45

+0

@ v1k45 Я добавил визуализированный {{csrf_token}} в отредактированный вопрос. Помимо этого, я просто рисую несколько строковых значений в шаблоне, который работает нормально – ankit

ответ

2

Эта ошибка вызвана processData и contentType вариантов в вашей функции AJAX. Удаление этих двух параметров поможет устранить проблему.

Объяснение: Аргументы должны быть отправлены в Django, как urlencoded с Content-Type application/x-www-form-urlencoded. Принимая во внимание, что если вы установили processData: false, он не будет кодировать Parmaters POST, а contentType: false отправит запрос ajax POST как text/plain.

Смежные вопросы