Отправка POST JSON запроса на сервер Django
Есть JS код для отправки данных в виде HTML form.
async function request(url, form, csrftoken) {
const response = await fetch(url, {
method: 'POST',
headers: {'X-CSRFToken': csrftoken},
body: new FormData(document.forms.namedItem(form)),
})
const result = await response.json()
return result
}
Есть Python скрипт для обработки запроса.
def test_r(request):
if request.method == 'POST' and request.user.is_authenticated:
user = auth.get_user(request)
pub = BasicText.objects.create(
date_time=datetime.now(),
text=request.POST.get('text'),
user_name=user,
)
return JsonResponse({'id': f'{pub.id}', 'date_time': pub.date_time, })
В данном виде сервер Django получает данные из HTML from (текст из input) и сохраняет в БД. Однако при попытке отправить данные на сервер в виде JSON request.POST пустует. Пробовал в таком виде данные отправлять, но как я уже писал request.POST.get() не выдаёт никаких результатов. Функция request_json НЕ работает.
async function request_json(url, csrftoken) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
'X-CSRFToken': csrftoken,
},
body: JSON.stringify({
'text': 'test_data',
}),
})
const result = await response.json()
return result
}
Как сделать так, чтобы можно было отправлять на сервер Django POST запрос с данными JSON?
--- PS ----
В итоге сделал таким образом (спасибо за ответы):
JS
async function request(url, data, csrftoken) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-CSRFToken': csrftoken,
},
body: JSON.stringify(data),
})
const result = await response.text()
return result
}
async function check_username() {
const url = '{% url "check_name_s" %}'
const data = {'name': document.getElementById('name').value, }
const csrftoken = '{{ csrf_token }}'
const result = await request(url, data, csrftoken)
console.log(result)
}
Python
from json import loads
def check_name_s(request):
if request.method == 'POST':
print(loads(request.body)['name'])
return HttpResponse('hello')
Ответы (1 шт):
Суть заключается в том, что в request.POST будут спарсены данные отправленные с типом контента application/x-www-form-urlencoded, а если тип контента application/json, то получить данные отправленные клиентом можно из request.body.
код вью
@csrf_exempt
def ajax(request):
print("POST:", request.POST)
print("BODY:", request.body)
return JsonResponse({"status": "success"})
отправляю запрос
import requests
requests.post("http://127.0.0.1:8000/ajax/", data={"a": "b"})
в логе
POST: <QueryDict: {'a': ['b']}>
BODY: b'a=b'
а теперь json
requests.post("http://127.0.0.1:8000/ajax/", json={"a": "b"})
POST: <QueryDict: {}>
BODY: b'{"a": "b"}'
т.е. тебе нужно самому десериализовать это.
import json
@csrf_exempt
def ajax(request):
print("POST:", request.POST)
print("BODY:", json.loads(request.body))
return JsonResponse({"status": "success"})