Как получить json от django?
Я делаю GET запрос к серверу на django:
fetch("http://127.0.0.1:8000/accounts/login/?next=/", {
method: "GET",
})
.then((res) => {
return res.json();
})
.then((data) => {
console.log(data);
});
Смотрю в девтулс, вижу: код 200. Смотрю в консоль и вижу Uncaught (in promise) SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data. Меняю res.sjon() на res.text() и получаю в консоль html страницы.
Вопрос: что и где мне поправить чтоб получить заветный json. (желательно в JS, но есть доступ и к django)
P.S. Из JSON я хочу добыть куки, для дальнейшей авторизации и получения html от сервера. А потом рендерить их в React.
Ответы (1 шт):
Подозреваю, что у вас не дописана вьюха. Я так понимаю, что на сервере во views.py есть некое представление типа:
def qwerty(request):
return render(request, 'application/some.html')
200 статус вы получаете, потому что нет никакой обработки. Запрос ушел - получаете 200. добавьте информативности обработчиками успешного и не успешного запроса Вьюха написанная мной выше, будет получать такой запрос как у вас и возвращать вам html потому что только его она и возвращает. ошибка json parce вызвана тем, что html код не валиден для json вида, меняя на text вы получаете html в виде текста. такие дела.
Решение: сформируйте json на бэк-части, например используя модуль json в python и верните его. Например(Осторожно!пишу на коленке):
import json
from django.http import HttpResponce
...
def qwerty(request):
if request.method == "GET":
data = {
"asd": 123
}
resp = json.dump(data)
return HttpResponce(resp)
return render(request, 'application/some.html')
Таким образом вы добавляете обработку события(получение гет запроса на сервере и поведение представления return HttpResponce), однако будьте внимательны, мой пример такой же упрощенный как и ваш, поэтому не стоит его использовать, т.к. будете получать data постоянно)) ведь get запрос на сервер идет и от других источников). добавьте ключ для идентификации запроса или используйте более сложный, например с помощью ajax