JavaScript `fetch()` не будет публиковать данные в Django
Проблема возникает в рамках Django. Соответствующие строки кода описаны ниже.
Это HTML-строки, в которых первая div
и вложенная p
будут заполнены другими HTML-элементами с помощью функции JavaScript; упомянутая функция JavaScript не приведена здесь для краткости:
<form method="POST">
{% csrf_token %}
<div id="bill">
</div>
<div>
<p id="total"></p>
</div>
<button onclick="record_order()">llllll</button>
</form>
Вот коды JavaScript для более раннего record_order()
, использованного в атрибуте onclick кнопки в HTML-строках:
function record_order() {
fetch("http://localhost:8000/", {
method: "POST",
body: JSON.stringify({
"a": 1,
"b": "vb"
}),
headers: {
"Content-type": "application/json; charset=UTF-8",
}
})
.then((response) => response.json())
.then((json) => console.log(json));
}
Кроме того, существует представление на основе классов, чей метод post
переопределен следующим образом:
def post(self, request):
print("---")
print(request.POST)
print("---")
return HttpResponseRedirect("/")
Кнопка при нажатии должна вызывать JavaScript fetch()
, который отправит данные на серверную сторону, чтобы к ним можно было получить доступ через request
. Но консоль браузера выходит из системы:
order.js:42
POST http://localhost:8000/ 403 (Forbidden)
record_order @ order.js:42
onclick @ (index):1331
и
Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
С другой стороны, терминал выдает ошибку, токен CSRF, и ничего больше:
---
Forbidden (CSRF token missing.): /
<QueryDict: {'csrfmiddlewaretoken': ['qD77PCO0L62oexifqwHWPT9WjB3SaRyau3SDlApCokLhCVcQb98wNOHCdBLNDDwk']}>
---
Проблема, скорее всего, заключается в части выборки, однако попытка использовать несколько HTTP-заголовков вообще ничего не дала.
Как можно получить нужные данные в post()
методе view
и сохранить их в базе данных SQLite с помощью моделей Django?
Не рекомендуется для производства:
Вы можете освободить свой просмотр от ожидания токена csrf из формы:
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt, name='dispatch')
class MyView(View):
def post(self, request):
data = json.loads(request.body)
print("Received Data:", data)
return JsonResponse({"message": "Data received"})
Или в другом случае вам нужно отправить токен CSRF в post-запросе:
function getCSRFToken() {
return document.querySelector('[name=csrfmiddlewaretoken]').value;
}
function record_order() {
fetch("http://localhost:8000/", {
method: "POST",
body: JSON.stringify({
"a": 1,
"b": "vb"
}),
headers: {
"Content-Type": "application/json; charset=UTF-8",
"X-CSRFToken": getCSRFToken() // here includes csrf token
}
})
.then(response => response.json())
.then(json => console.log(json))
.catch(error => console.error("Error:", error));
}