我创建了一个简单的flask应用,并且正在读取来自python的响应:
response = requests.post(url,data=json.dumps(data), headers=headers )
data = json.loads(response.text)
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,在某些情况下,我想返回400或500条消息响应。到目前为止,我正在这样做:
abort(400, 'Record not found')
#or
abort(500, 'Some error...')
Run Code Online (Sandbox Code Playgroud)
这确实会在终端上打印消息:
但是在API响应中,我不断收到500错误响应:
编辑:
代码的结构如下:
|--my_app
|--server.py
|--main.py
|--swagger.yml
Run Code Online (Sandbox Code Playgroud)
其中server.py具有以下代码:
from flask import render_template
import connexion
# Create the application instance
app = connexion.App(__name__, specification_dir="./")
# read the swagger.yml file to configure the endpoints
app.add_api("swagger.yml")
# Create a URL route in our application for "/"
@app.route("/")
def home():
"""
This function just responds to the browser URL
localhost:5000/
:return: the rendered template "home.html"
"""
return render_template("home.html")
if __name__ == "__main__":
app.run(host="0.0.0.0", port="33")
Run Code Online (Sandbox Code Playgroud)
而且main.py具有我用于API端点的所有功能。
例如:
def my_funct():
abort(400, 'Record not found')
Run Code Online (Sandbox Code Playgroud)
调用my_funct时,会在终端上显示“找不到记录”,但不会显示在API本身的响应中,在该处我总是收到500条消息错误。
tit*_*ban 62
您有多种选择:
最基本的:
@app.route('/')
def index():
return "Record not found", 400
Run Code Online (Sandbox Code Playgroud)
如果要访问标头,可以获取响应对象:
@app.route('/')
def index():
resp = make_response("Record not found", 400)
resp.headers['X-Something'] = 'A value'
return resp
Run Code Online (Sandbox Code Playgroud)
或者你可以让它更明确,而不只是返回一个数字,而是返回一个状态代码对象
from flask_api import status
@app.route('/')
def index():
return "Record not found", status.HTTP_400_BAD_REQUEST
Run Code Online (Sandbox Code Playgroud)
您可以在此处阅读有关前两个的更多信息:关于响应(Flask 快速入门)
以及第三个:状态代码(Flask API 指南)
Hol*_*ehg 19
我喜欢使用这个flask.Response类:
from flask import Response
@app.route("/")
def index():
return Response(
"The response body goes here",
status=400,
)
Run Code Online (Sandbox Code Playgroud)
flask.abort是一个包装器,werkzeug.exceptions.abort它实际上只是一个帮助方法,可以更容易地引发 HTTP 异常。在大多数情况下这很好,但是对于 Restful API,我认为明确返回响应可能更好。
您可以返回一个元组,其中第二个元素是状态(400 或 500)。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Record not found", 400
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
从 python 调用 API 的示例:
import requests
response = requests.get('http://127.0.0.1:5000/')
response.text
# 'This is a bad request!'
response.status_code
# 400
Run Code Online (Sandbox Code Playgroud)
这是我多年前编写的 Flask 应用程序的一些片段。它有一个 400 响应的示例
import werkzeug
from flask import Flask, Response, json
from flask_restplus import reqparse, Api, Resource, abort
from flask_restful import request
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('address_to_score', type=werkzeug.datastructures.FileStorage, location='files')
class MissingColumnException(Exception):
pass
class InvalidDateFormatException(Exception):
pass
@api.route('/project')
class project(Resource):
@api.expect(parser)
@api.response(200, 'Success')
@api.response(400, 'Validation Error')
def post(self):
"""
Takes in an excel file of addresses and outputs a JSON with scores and rankings.
"""
try:
df, input_trees, needed_zones = data.parse_incoming_file(request)
except MissingColumnException as e:
abort(400, 'Excel File Missing Mandatory Column(s):', columns=str(e))
except Exception as e:
abort(400, str(e))
project_trees = data.load_needed_trees(needed_zones, settings['directories']['current_tree_folder'])
df = data.multiprocess_query(df, input_trees, project_trees)
df = data.score_locations(df)
df = data.rank_locations(df)
df = data.replace_null(df)
output_file = df.to_dict('index')
resp = Response(json.dumps(output_file), mimetype='application/json')
resp.status_code = 200
return resp
@api.route('/project/health')
class projectHealth(Resource):
@api.response(200, 'Success')
def get(self):
"""
Returns the status of the server if it's still running.
"""
resp = Response(json.dumps('OK'), mimetype='application/json')
resp.status_code = 200
return resp
Run Code Online (Sandbox Code Playgroud)
我认为您abort()正确使用了该功能。我怀疑这里的问题是错误处理程序捕获 400 错误,然后出错,从而导致 500 错误。有关烧瓶错误处理的更多信息, 请参阅此处。
例如,以下代码会将 400 错误更改为 500 错误:
@app.errorhandler(400)
def handle_400_error(e):
raise Exception("Unhandled Exception")
Run Code Online (Sandbox Code Playgroud)
如果您没有进行任何错误处理,则它可能来自框架connexion,尽管我对此框架不熟悉。
| 归档时间: |
|
| 查看次数: |
1310 次 |
| 最近记录: |