Я не могу получить доступ к данным в моем post-запросе axios

#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.