#javascript #python #python-requests #axios
#javascript #python #python-запросы #axios
Вопрос:
Я пытаюсь получить доступ к данным, которые я сохранил в localStorage, чтобы я мог использовать их в своем маршруте Python.
Вот мой запрос axios:
if ($('.box.genre').length === $('.box.genre.completed').length) {
async function getScore() {
let score = parseInt(localStorage.getItem("score"));
const response = await axios.post(
`${BASE_URL}/game-over`, { "score": score}, {
headers: {
'content-type': 'application/json'
}
}).then(response =>
localStorage.getItem("score", response.data.score));
console.log('Your score was: ', response);
window.location = "/game-over";
}
getScore();
}
Когда я регистрирую ответ в консоли, я могу увидеть результат. Похоже, мой код на Python не работает. Я не могу получить данные. Я получаю ошибку AttributeError: объект ‘NoneType’ не имеет атрибута ‘content’.
Вот мой Python:
@app.route('/game-over', methods=["GET", "POST"])
def game_over():
if CURR_USER_KEY in session:
user = User.query.get(session[CURR_USER_KEY])
response = request.json()
data = json.loads(response.content)
score = data['score']
user.high_score = score
db.session.commit()
high_score = user.high_score
name = user.username
return render_template('endgame.html', name=name, high_score=high_score)
Я просто пытаюсь получить оценку от axios, чтобы я мог обновить свою таблицу SQL. Большое спасибо за помощь!
Комментарии:
1. Я не понимаю, почему вы используете
requests
. Еслиaxios
отправляет запрос сscore
помощью (в формате JSON)/game-over
, тоgame_over()
следует использоватьFlask.response.json()
для его получения. Иgame_over()
должен отправить ответaxios
(в формате JSON), используяreturn jsoinify({'score': score})
(вместоreturn render_template(...)
). Кодrequests.get()
не отправляется обратно в веб-браузер и axios, но он отправляет запрос на другой URL-адрес на сервере, и это означает другую функцию в Flask на сервере.2. Использование request.json() по-прежнему выдает ошибку NoneType. Кроме того, если я не буду отображать свой шаблон, как будет загружаться моя страница? Я хочу показать оценку и имя пользователя на моей последней странице.
3. используйте две функции — одну для отображения страницы при посещении браузера
http://example.com/game-over
, а вторую для работы,axios.post("/game-over", ...)
но для этого может потребоваться новый URL -адрес — ie./game-over-ajax
. ИЛИdef game_over()
используетсяif/else
для проверки, является ли это обычным запросом или ajax, и отправки обратно HTML (для обычного запроса) или данных JSON (для запроса ajax)
Ответ №1:
В вашем коде есть 2 проблемы.
Во-первых: если вы хотите установить элемент в локальном хранилище, вы должны использовать setItem
вместо getItem
Во-вторых: когда вы используете асинхронную функцию, вам не нужно использовать .then
async function getScore()
const response = await axios.post(
`${BASE_URL}/game-over`,
{ 'score': score },
{ headers: { 'content-type': 'application/json' }
})
if (response) {
localStorage.setItem('score', response.data.score)
}
}
Комментарии:
1. Спасибо. Я попробую это сделать, когда вернусь домой через несколько часов.
2. Это не сработало. Я уже установил значение для локального хранилища ранее в своем коде. Я пытаюсь получить его. Я думаю, что проблема в моем коде Python. Я не знаю, какой метод использовать для получения оценки из ответа axios.