我正在制作一个在家里的树莓派上运行的小型网络界面。它承载了一些 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 错误页面?
最佳答案
我发现解决此问题的最佳方法是使用蓝图。
我将我的 API 放在它自己的蓝图中,在那里我可以单独为该蓝图定义一个错误处理程序。
唯一的问题是,当 api 中存在不存在的页面时,将使用默认的错误处理程序,而不是我为 api-blueprint 定义的错误处理程序。也有一些解决方法,但这显然是 Flask 的局限性,没什么大不了的。
关于Python Flask - json 和 html 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44618005/