【发布时间】:2017-11-20 22:17:13
【问题描述】:
我正在家里制作一个在树莓派上运行的小型 Web 界面。它托管一个小的 REST api 以及一些网页。
我正在使用 Flask,并且有一个路由 '/' 用于索引,还有一些路由用于 REST api '/api/v1.0/tasks'。
@app.route('/')
def index():
return render_template('index.html')
@app.route('/gnodes/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
@app.route('/gnodes/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = [task for task in tasks if task['id'] == task_id]
if not task:
abort(404)
return jsonify({'task': task[0]})
但是,abort(404) 返回一个 html 错误页面,这对于普通页面来说很好,但我想在请求不存在的任务时返回一个 json。
所以我已经覆盖了错误处理程序:
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
但是,现在所有错误都返回 json,而不仅仅是 api 错误。
所以我的问题是,如何使对 API 的失败请求返回 json 错误,而其他错误则返回默认的 html 错误页面?
【问题讨论】:
-
@cricket_007 哦,目前这只是一个全局变量,不过稍后会被一些在数据库中查找任务的代码所取代。
-
制作一个自定义装饰器来处理失败的 api 请求
-
@TheOddler 无论如何,任务是什么或它在哪里定义在这种情况下并不重要
-
好的,只是确保这不是错误的原因
-
我相信你可以写
abort(404, 'Task not found'),第二个参数将作为error.description传递。见stackoverflow.com/a/21301229/567595。然后,您的错误处理程序可以为“找不到任务”错误返回 json,并为所有其他错误返回 404 页面。