pycharm 返回HTML错误消息,而不是自定义JSON错误消息

clj7thdc  于 2023-10-20  发布在  PyCharm
关注(0)|答案(2)|浏览(160)

我有一个API_1,我和Postman打电话。如果计算中有错误,将以JSON格式输出错误消息以及状态代码。我使用以下代码:

@app.errorhandler(Exception)
def handle_default_error(e):
    message = e.description
    return jsonify(error=message), e.code

Postman中的输出如下所示:

这是将返回的正确JSON错误消息。
我的目标是API_Total调用API_1。如果我现在用Postman调用API_Total,然后Postman调用API_1,并且在计算中出现错误,JSON错误消息通常应该从API_1传递到API_Total,然后由API_Total输出。但是,我得到以下输出:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title>Error response</title>
</head>
<body>
    <h1>Error response</h1>
    <p>Error code: 400</p>
    <p>Message: Bad Request.</p>
    <p>Error code explanation: 400 - Bad request syntax or unsupported method.</p>
</body>

但我不希望JSON错误消息被HTML错误消息取代。

return jsonify(error=message), e.code, {'Content-Type': 'application/json'}

不幸的是,这并没有改变任何东西,仍然没有JSON错误消息。

#Simplified procedure

#1. Postman calls API_Total
@app.route('/api/API_Total', methods=['GET'])

#2. API_1 is called by API_Total
@app.route('/api/API_1', methods=['GET'])
      ....

    try:
        response = requests.request("GET", url, headers=headers_content, data=payload_content, proxies=proxies)
    except:
        return None
        
        
#3. API_1
    #Performing the calculations
    #If an error occurs:
    return abort(404, 'Bad Request')
    #app.errorhandler is called
    @app.errorhandler(Exception)
    def handle_default_error(e):
        message = e.description
        #Return to API_Total
        return jsonify(error=message), e.code


#4 When an error occurs, API_Total displays it as HTML rather than JSON unless I set the Status Code to 200.

这就是我的问题(#3)。如果我使用jsonify返回它,并且没有将状态码设置为200,则错误消息将以HTML形式输出。但是如果我使用return jsonify并将状态码设置为200,则错误消息将正确输出为JSON。但是我使用abort得到错误消息和状态代码。我也想正确返回状态码,而不是默认设置为200。

yqkkidmi

yqkkidmi1#

也许这样的东西会为你工作:

# Customize error responses based on the exception type
 if isinstance(e, ValueError):
     error_message = "ValueError: " + error_message
     error_code = 400  # Bad Request

 return jsonify({"error": error_message}), error_code
o0lyfsai

o0lyfsai2#

我的意思是这样的东西,人们可以复制和粘贴测试(例子从ChatGPT,而不是实际的代码或答案):

from flask import Flask, abort, jsonify, request
import requests

app = Flask(__name__)

@app.route('/API_1', methods=['GET'])
def api_1():
    try:
        # Your API_1 logic here
        result = {"message": "API_1 response"}
        raise Exception("MY ERROR")
        return jsonify(result)
    except Exception as e:
        return jsonify(error=str(e)), 500

@app.route('/API_Total', methods=['GET'])
def api_total():
    try:
        try:
            response = requests.request("GET", 'http://127.0.0.1:5000/API_1')
        except: 
            return None
        
        if response.status_code != requests.codes.ok:
            return abort(400, '444 error')
        
        # Your API_Total logic here, which may include processing the response from API_1
        total_result = {"message": "API_Total response", "API_1_response": response.json}
        
        return jsonify(total_result)
    except Exception as e:
        return jsonify(error=str(e)), 500

@app.errorhandler(Exception)
def handle_default_error(e):
    message = str(e)
    return jsonify(error=message), 500

if __name__ == '__main__':
    app.run(debug=True)

更新:
我已经更新了代码,使用请求调用API_1,这似乎工作正常。
http://127.0.0.1:5000/API_1返回

{
  "error": "MY ERROR"
}

http://127.0.0.1:5000/API_Total返回

{
  "error": "400 Bad Request: 400 error"
}

相关问题