Хорошо, я собираюсь перепроектировать этот ответ, чтобы вы поняли, откуда я.Промежуточное программное обеспечение CSRF работает следующим образом:
You make request -------> request hits csrf --(invalid/no token)--> render 403
middleware
|
(valid token)
|
\ /
Call view
|
\ /
middleware sets
csrf cookie
|
\ /
Response appears
Другими словами, если вы видите страницу 403 csrf, ваше представление никогда не вызывалось.Вы можете подтвердить это, прикрепив ложное утверждение печати в представлении и наблюдая за выводом runserver
, когда вы делаете свой запрос.
Чтобы решить эту проблему, вам нужно либо отключить csrf (не очень хорошо), либо использовать один из доступных вам методов ajax .Если требуемый токен передан в ваше представление, оно будет фактически выполнено.
Причина, по которой ваше представление не вызывается, состоит в том, чтобы предотвратить фактическое действие действия с поддельного сайта - например, если вы отклонили шаблонво время ответа пользователь уже будет зарегестрирован. То же самое происходит с декораторами функций.
Что касается промежуточного программного обеспечения, устанавливающего cookie, которое вообще не изменяет или не зависит от функции рендеринга - это устанавливаетHTTP-заголовок Cookie: ...
в ответе.Все ответы в Django являются HttpResponse
объектами, пока он окончательно не преобразует их в выходные данные;render
функции являются помощниками, но это не то, что вызывает вашу проблему здесь.
Редактировать Я преобразую то, что у вас есть, в вызов рендеринга.Вы можете сделать это:
return render_to_response(`ajax_templates/login_response.html`,
{'loginresponse': json.dumps(result)})
Где ajax_templates/login_response.html
просто:
{% loginresponse %}
Вот и все.HttpResponse
имеет основной аргумент по умолчанию, который является возвращаемой строкой (буквально html веб-страницы);это то, что вы делаете изначально.render_to_response
и render
являются ярлыками для этого, которые делают это:
render_to_response called ----> open template asked for --> substitute arguments
|
\ /
django instructs web server <--- return this from view <-- create HttpResponse
to send to client object