Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как в Django передать JavaScript-ом токен для метода POST при динамическом обновлении страниц?

В последних Django для предотвращения атак предусмотрены токена при передачи данных методом POST. Что-то типа:

def main_init ( request ) :
    dimention_to_template = {}   # словарь, для передачи шаблону
    dimention_to_template.update( { 'data': 100 } ) 
    dimention_to_template.update( csrf(request) ) # токен, для метода POST
    response = render ( request, "index.html", dimention_to_template )
    return response

Соответственно в шаблоне пишем, что-то типа:

<form  action="get_address" method="post">
    {% csrf_token %}
    <input type="text" name="addr" value="Город, улица, дом" />
    <button type="submit">Найти</button>
</form>

И все работает.

Но вот если событие "submit" в форме обрабатывает JavaScript (например, если нужно динамическое обновление страниц), то передача токена не происходит. Что вызывает 403 ошибку. То есть например, если у нас в шаблоне:

<form id="input_address">
    <div id="box">
        {% csrf_token %}
        <input type="text" name="addr" value="Город, улица, дом" id="address" />
        <button type="submit">Найти</button>
    </div>
</form>

И есть скрипт, обеспечивающий submit и перегружающий контент в блоке "box":
<script type="text/javascript">
    $(document).ready(function(){
        $('#input_address').submit(function(){
            $.ajax({
                type: "POST",
                url: "get_address",
                data: "address="+$("#address").val(),
                success: function(html){
                    $("#box").html(html);
                }
            });
            return false;
        });
    });
</script>

То, естественно, токен не отправляется и возникает ошибка 403. Задача отправить токен через JavaScript/ Только как это сделать? Ведь он формируется Django... Как его спросить что там в токене переодается и как на самом деле этот токен обзывается?
  • Вопрос задан
  • 4619 просмотров
Решения вопроса 1
barker
@barker
Миллион же ответов в инете гуглится. Я чаще всего в таких случаях (т.е. во внешних каких-то более-менее повторно используемых скриптах) тупо выношу токен в основную страницу, потом использую просто как JS-переменную: dark-barker.blogspot.ru/2013/10/django-csrftoken-a...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vvpoloskin
@vvpoloskin
Инженер связи
Потому что делают либо
а) data = form.serialize() если мы про jquery
б) как написано в мануале django в общем случае
в) сами берут значения из всех input-ов формы в самом общем случае
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы