2017-06-18 21 views
3

ラズベリーパイを自宅で実行している小さなWebインターフェイスを作っています。これは、いくつかのWebページだけでなく、いくつかのREST APIもホストしています。Python Flask - jsonとhtmlの両方404エラー

私は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を返すように望んでいました。

だから私はのErrorHandlerを上書きしました:

@app.errorhandler(404) 
def not_found(error): 
    return make_response(jsonify({'error': 'Not found'}), 404) 

しかし、今、すべてのエラーではなく、唯一のAPIのエラーよりも、JSONを返します。

私の質問は、どのようにAPIに失敗したリクエストをjsonエラーを返すことができますが、他のエラーはデフォルトのhtmlエラーページですか?

+0

@ cricket_007あの瞬間はグローバル変数ですが、後でデータベース内のタスクを探しているコードに置き換えられます。 –

+0

失敗したAPI要求を処理するためのカスタムデコレータを作成する –

+0

@TheOddlerどのようなタスクか、定義されている場所はこのコンテキストでは重要ではありません –

答えて

0

これを解決するための最良の方法は、青写真を使用することです。

自分のAPIを自分の青写真に入れました。その青写真だけでエラーハンドラを定義できます。

唯一の問題は、apiに存在しないページがある場合、api-blueprint用に定義したページではなく、デフォルトのエラーハンドラが使用されることです。それにもいくつかの回避策がありますが、これはフラスコの限界です。

関連する問題