Я получил несколько полезных советов по StackOverflow о том, как удалить все скрытые поля с помощью JavaScript.
Отправка формы отправляет пользователя на /submit
, вызывая представление submit_form
.В моем файле views.py я определяю свою индексную страницу (вместе с формой) и страницу, которая получает отправку (моя страница /index
печатает ошибки для меня, но это ни на что не должно влиять):
def index(request, error_message = ''):
t = get_template('index.html')
html = t.render(Context( { 'ERROR_MESSAGE': error_message } ))
return HttpResponse(html)
def submit_form(request):
# get the POST data out of request and do something
pass
Мне удалось устранить ошибку, изменив код на:
from django.contrib.csrf.middleware import csrf_exempt
@csrf_exempt
def submit_form(request):
# get the POST data out of request and do something
pass
По сути, это отключает CSRF для функции submit_form.Однако я уверен, что это не идеальное исправление (теперь я не проверяю подделки в моей форме).
Я пробовал более сложные исправления, такие как
- Добавление этот код для непосредственного следования коду jQuery (который удаляет скрытые поля из отправки)
init:function(){
var ac=this
# advice from StackOverflow to remove hidden
# fields from POST submission
jQuery(document).ready(function($){
$("form").submit(function() {
$(this).find(":hidden").remove();
});
# AJAX CSRF code inserted here
#...
}
Я видел несколько вопросов, задающих подобные вещи (и ссылки в книге Django), но не видел простого и ясного ответа.Например, даже если я собирался допустить публикацию моего csrf_token
(что, тем не менее, я знаю, это плохая идея), все еще неясно, следует ли мне отображать это на моей странице индекса (и тогда будет отправлена форма, которая будет иметьтокен) или я должен сделать что-то в моем submit_form
коде.Кодовая книга Django (см. Выше) использует my_view
в качестве функции просмотра, в которой отображается токен;это имя не очень полезно!
У кого-нибудь есть небольшой пример работы CSRF (с изменением формы javascript)?Я действительно думаю, что было бы полезно (мне и многим другим людям в StackOverflow увидеть это. В идеале это было бы как можно проще (два представления: одно доставляет форму, другое печатает ее содержимое).
Большое спасибо за вашу помощь.
Обновление: Я все еще получаю эту ошибку, даже когда я предваряю csrfmiddlewaretoken
от удаленияКогда я * не выполняю никакой обработки JavaScript, моя форма в порядке. И я проверил, что только мой
Есть ли какой-то способ, которым CSRF может видеть, что некоторые элементы формы удалены? Я не могу найтичто-то другое в моем QueryDict
объекте (который отправляет данные из формы с помощью POST).
Я бы очень признателен за любую помощь!