2016-03-21 21 views
0

я пытаюсь добавить на страницу HTML форму с JS (как HTML маркер {%} csrf_token% при загрузке страницы делает):Джанго CSRF токен с JS

table += "<td><form action='' method='post'>"; 
table += "<input type='submit' value='Delete?' />"; 
table += "</form></td>; 
$("#tbody").append(table); 

моя проблема заключается в том, что я получаю сообщение об ошибке проверки CSRF:

Forbidden (403) 
CSRF verification failed. Request aborted. 
Help 
Reason given for failure: 
    CSRF token missing or incorrect. 

я пытался добавить маркер пользовательского CSRF:

var buf = new Uint8Array(1); 
window.crypto.getRandomValues(buf); 

table += "<input type='hidden' name='csrfmiddlewaretoken' value='" + buf[0] + "'>"; 

, но я все еще получаю ошибку.

я также в моих JS файл следующий код (который я получил от сайта Джанго - и я не знаю, как это на самом деле работает ..):

//enable csrf post ajax 

//This function gets cookie with a given name 
function getCookie(name) { 
var cookieValue = null; 
if (document.cookie && document.cookie != '') { 
    var cookies = document.cookie.split(';'); 
    for (var i = 0; i < cookies.length; i++) { 
     var cookie = jQuery.trim(cookies[i]); 
     // Does this cookie string begin with the name we want? 
     if (cookie.substring(0, name.length + 1) == (name + '=')) { 
      cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
     break; 
    } 
} 
} 
return cookieValue; 
} 
var csrftoken = getCookie('csrftoken'); 

/* 
The functions below will create a header with csrftoken 
*/ 

function csrfSafeMethod(method) { 
// these HTTP methods do not require CSRF protection 
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 

$.ajaxSetup({ 
beforeSend: function(xhr, settings) { 
    if (!csrfSafeMethod(settings.type) && !this.crossDomain && 
     (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url)))) { 
    // Only send the token to relative URLs i.e. locally. 
    xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
    } 
} 
}); 

есть способ, чтобы добавить токен csrf с js, как я пытался или не может быть?

+0

Предложение: использовать JQuery $ .cookie ("csrftoken"). Метод getCookie не требуется. –

ответ

1

код Javascript обеспечивается Джанго для csrftoken экстракции присваивает csrftoken значение переменной с именем csrftoken

Вы можете получить доступ к нему в любом месте его имени переменной, как этот:

table += "<input type='hidden' name='csrfmiddlewaretoken' value='" + csrftoken + "'>"; 

Убедитесь, что вы имеете включили js, предоставленные django на вашей странице, прежде чем получить доступ к csrftoken

Кроме того, как отметил @Sander, если вы используете встроенную JS, вы можете напрямую использовать csrf_token template tag ins TEAD.

table += "{% csrf_token %}"; 
1

Является ли js добавленным как встроенный js к вашему шаблону django?

В этом случае вы можете сделать:

table += "<td><form action='' method='post'>"; 
table += "{% csrf_token %}"; 
table += "<input type='submit' value='Delete?' />"; 
table += "</form></td>; 
$("#tbody").append(table); 
Смежные вопросы