15

HTML で返された例外により、JSON クライアントが壊れます。この出力をjson化したいと思います。

詳細: この API アプリのエンドポイントであるビュー関数があります。

ご覧のとおり、この関数は結果を json で返します。

@app.route('/route1')
def api_route1():
    if user_id in request.args: 
        k1 = request.args['user_id']
        return flask.jsonify(recs=some_function(k1))
    else:
        return "no valid user_id supplied"

問題、未処理の例外は HTML にあります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
    Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>TypeError: 'NoneType' object is not iterable // Werkzeug Debugger</title>
        <link rel="stylesheet" 
            href="?__debugger__=yes&amp;cmd=resource&amp;f=style.css" 
            type="text/css">

これにより、json クライアントが壊れます。HTML形式は明らかにデフォルトですが、それをオプトアウトしてjson化された例外を指定する方法がわかりません(理想的には、ヘッダーでさえ返されたものをすべてjson化します)。

必要なものは優れた Flask ドキュメントのどこかにあると思いますが、見つかりません。

4

3 に答える 3

20

フラスコでHTTPエラー ハンドラを定義する必要があります。

404 ハンドラーを返す単純な JSON は、次のようになります。

@app.errorhandler(404)
def page_not_found(e):
    return flask.jsonify(error=404, text=str(e)), 404

これにより、クライアントでチェックすることができdata.error、存在する場合は data.text でエラー テキストを取得できます (文字列表現が「404: Not Found」であるまま渡されたエラー) ewerkzeug.exceptions.NotFound

于 2012-12-10T00:12:49.823 に答える
7

JSON クライアントがトレースバックを利用できるようにすると、機密情報が開示される可能性があります。

私のアドバイスは次のとおりです。

  • デバッグをオフにする
  • セントリーなどのログ集計ツールをインストールする
  • このアプリケーションのエラー 500 ページが json 形式で一般的なエラーを返すようにする

500 ページは次のようになります。

{ "error": "500 - internal server error" }
于 2012-12-08T04:25:16.657 に答える
2

以下のコードでうまくいくはずです。したがって、発生した可能性のある例外をキャッチし、traceback モジュールを使用して文字列としてフォーマットされた例外の詳細を取得し、それを有効な json として返すという考え方です。発生すると予想される主な種類のエラーと、より読みやすいエラー メッセージを含む一連の except ステートメントを配置することをお勧めします。次に、奇妙で予期しないことが起こった場合に備えて、すべてをキャッチすることを除いて、最後に1つ持つことができます.

import traceback

@app.route('/route1')
def api_route1():
    if user_id in request.args: 
        try:
            k1 = request.args['user_id']
            return flask.jsonify(recs=some_function(k1))
        except:
            return flask.jsonify(exception=traceback.format_exc())
    else:
        return flask.jsonify(exception="no valid user_id supplied")
于 2012-12-08T04:44:17.810 に答える