похоже, не удается прочитать сообщение об ошибке в react js (axios) из flask api (используя jsonify)

#python #reactjs #flask #axios #flask-restful

#python #reactjs #flask #axios #flask-restful

Вопрос:

вот строка кода, возвращающая сообщение об ошибке из flask api

 return jsonify(message='wrong username or password'),400
  

читаю его отсюда в react js

   axios
    .post("http://127.0.0.1:5000/authentication/login", body)
    .then((res) => {
        console.log(res)
    })
    .catch((error) => {
      console.log(error);
    });
  

и это то, что я вижу в консоли

 {"message":"Request failed with status code 400","name":"Error","stack":"Error: Request failed with status code 400n    at createError (http://localhost:3000/static/js/1.chunk.js:854:15)n    at settle (http://localhost:3000/static/js/1.chunk.js:1075:12)n    at XMLHttpRequest.handleLoad (http://localhost:3000/static/js/1.chunk.js:329:7)","config":{"url":"http://127.0.0.1:5000/auth/login","method":"post","data":"{"phone":"","password":""}","headers":{"Accept":"application/json, text/plain, */*","Content-Type":"application/json"},"transformRequest":[null],"transformResponse":[null],"timeout":0,"xsrfCookieName":"XSRF-TOKEN","xsrfHeaderName":"X-XSRF-TOKEN","maxContentLength":-1}}
  

введите описание изображения здесь

Результаты не содержат пользовательского сообщения «неправильное имя пользователя или пароль»

Комментарии:

1. можете ли вы убедиться, что ваш код даже достигает инструкции return. я думаю, что с вашим запросом возникла проблема, и ответ, который вы видите, исходит от самого flask.

2. он достигает инструкции return, jsonify (сообщение = ‘неправильное имя пользователя или пароль’), 400.. он также может определить свой код состояния (400), но не возвращает пользовательское сообщение об ошибке. сообщение = ‘неправильное имя пользователя или пароль’

3. или есть лучший способ вернуть ошибку, отличный от использования jsonify?

Ответ №1:

на самом деле получили решение, что-то простое

данные об ошибке могут быть доступны из

 console.log(error.response.data);
  

Ответ №2:

flask по умолчанию возвращает html-страницу вместо json при возникновении ошибки. чтобы заставить run возвращать обычный json, как в ответах 200, напишите это в своем приложении flask:

 from werkzeug.exceptions import HTTPException

@app.errorhandler(HTTPException)
def handle_exception(e):
    """Return JSON instead of HTML for HTTP errors."""
    print(e)
    # start with the correct headers and status code from the error
    response = e.get_response()
    # replace the body with JSON
    response.data = json.dumps({
        "code": e.code,
        "name": e.name,
        "description": e.description,
    })
    response.content_type = "application/json"
    return response

  

тогда, например, для такого возврата в flask

 ...
return json.dumps(str(e)), 409
  

и затем вы можете перехватить его в своем js:

 ...
    }).then(function(response) {
      ...
    
    }).catch((error) => {
      console.log(error.response.data); // will log your error as string
    })