Ошибка csrf при имитации post-запроса в django
форма, которую я хочу смоделировать
<form action="{% url 'reset' %}" name="form1" id="form1" method="POST">
{% csrf_token %}
<div class="py-1">
<input class="focus:outline-none w-full p-1 border border-gray-300 rounded-md placeholder:font-light placeholder:text-gray-500 placeholder:text-sm pl-2"
type="text" name="username" id="" placeholder="username" required>
</div>
<div class="flex justify-between w-full py-4">
<div class="mr-24">
<span class="text-md text-gray-400"> Dont'have an account? </span>
<a class="font-bold text-black"><a href="/signup" class="font-bold">Sign up </a></span>
</div>
<span class="font-bold text-md"><a href="{% url 'signin' %}"class="font-bold">sign in </a></span>
</div>
<button class="w-full bg-black text-white p-2 rounded-lg mb-6 hover:bg-blue-400 hover:text-white "
type="submit" >
submit
</button>
</form>
обращает внимание на то, что я добавляю атрибут form_name к запросу post в js перед его отправкой
document.getElementById('form1').addEventListener('submit', function(event) {
event.preventDefault(); // Prevent default form submission
var form = this;
var formData = new FormData(form);
formData.append('form_name', 'form1');
fetch(form.action, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': '{{ csrf_token }}'
}
})
.then(response => response.json())
.then(data => {
if (data.show_form2) {
showForm2(data);
}
if (data.messages) {
const messages = JSON.parse(data.messages);
showMessages(messages);
}
}).catch(error => console.error('Error:', error));
});
и часть представления, которая имитирует пост-запрос
data = {'username': request.user.username, 'form_name': "form1"}
csrf_token = get_token(request)
response = requests.post('http://127.0.0.1:8000/reset', data=data, headers={'X-CSRFToken': csrf_token})
но я получаю эту ошибку Запрещено (CSRF cookie не установлен.): /reset. пожалуйста, помогите
Подход, который помогает мне преодолеть эту проблему, называется requests Session и работает следующим образом:
session = requests.Session()
resp = session.get('http://127.0.0.1:8000/reset') # Get form to get valid csrf token
csrf_token = resp.cookies['csrftoken']
resp2 = session.post('http://127.0.0.1:8000/reset', data=data, headers={'X-CSRFToken': csrf_token})