2010-09-20 1 views
1

У меня есть веб-приложение GWT, работающее с сервером Django. Недавно я обновил Django до версии 1.2 и не смог получить HTTP-сообщения для работы из моего приложения GWT. Я получаю эту ошибку:Django 1.2 Сообщения CSRF и HTTP из Google Web Toolkit

CSRF verification failed. Request aborted.

Reason given for failure:

CSRF token missing or incorrect. 

Я позволил CSRF промежуточное программное («django.middleware.csrf.CsrfViewMiddleware», «django.middleware.csrf.CsrfResponseMiddleware»), который работает для CONTRIB приложений, таких как логин, но похоже, что токен не добавляется к сообщениям, сделанным через GWT. Есть идеи? Заранее спасибо.

ответ

0

Если вы отметили шаблоны для auth.login, вы заметите, что токен CSRF явно включен внутри тега <form>.

<form method="post" action="."> 
    {% csrf_token %} 

Это раскладывается в скрытом поле, когда страница отображается на GET запросу. Что-то вроде:

<form method="post" action="."> 
    <div style='display:none'> 
     <input type='hidden' name='csrfmiddlewaretoken' 
      value='90064bf0e86edacfdb60595e3e2b8f23' /> 
    </div> 

Этот маркер затем передается обратно к представлению на POST и выверены.

Следовательно, перед тем, как вы сможете POST получить доступ к CSRF, вы должны сначала получить токен из указанного вида.

Вы можете проверить/убедиться, что у вас есть токен CSRF, прежде чем делать запрос POST к представлению? В качестве альтернативы вы можете отключить защиту CSRF для представления с помощью декоратора csrf_exempt. Это может быть не очень хорошая идея.

Update

This is the point of my question: I am not using django templates for my front-end and thus I cannot tag forms with the token. I am using GWT for my front-end, which is rendering the form for the post.

Вы уже сделать GET запрос на представление Джанго перед отображением страницы? В этом случае вы можете получить токен CSRF, проанализировав содержимое ответа.

Если нет, вам нужно будет явно сделать запрос GET к представлению (при условии, что он поддерживает GET) и проанализировать ответ для токена CSRF. Например, см. this question.

+0

Это вопрос моего вопроса: я * не * использовал шаблоны django для моего front-end, и поэтому я не могу пометить формы с помощью токена. Я использую GWT для моего front-end, который предоставляет форму для сообщения. – Neil

+0

@NP: обновил мой ответ. См. Выше. –