【问题标题】:Python Flask - Both json and html 404 errorPython Flask - json 和 html 404 错误
【发布时间】: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 页面。

标签: python flask


【解决方案1】:

我发现解决此问题的最佳方法是使用蓝图。

我将我的 API 放在它自己的蓝图中,在那里我可以单独为那个蓝图定义一个错误处理程序。

唯一的问题是,当 api 中有不存在的页面时,使用默认的错误处理程序,而不是我为 api-blueprint 定义的错误处理程序。也有一些解决方法,但这显然是 Flask 的限制,没什么大不了的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2020-01-06
    • 2013-06-08
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多