2017-06-18 126 views
3

我正在一個小型web界面上運行一個覆盆子pi在家裏。它承載了一些REST API以及一些網頁。Python燒瓶 ​​- 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) 

不過,現在所有的錯誤返回JSON,而不僅僅是API錯誤。

所以我的問題,我怎樣才能使API失敗的請求返回json錯誤,但其他錯誤默認的html錯誤頁面?

+0

@ cricket_007哦,目前這只是一個全局變量,儘管稍後將被代碼尋找數據庫中的任務所取代。 –

+0

做一個自定義的裝飾器來處理失敗的api請求 –

+0

@TheOddler任何方式什麼是任務或在何處定義在這方面無關 –

回答

0

我發現解決這個問題的最好方法是使用藍圖。

我把我的API放在它自己的藍圖中,在那裏我可以爲藍圖單獨定義一個錯誤處理程序。

唯一的問題是,當api中存在不存在的頁面時,將使用默認的錯誤處理程序,而不是我爲api-blueprint定義的頁面。對此也有一些解決方法,但這是Flask的侷限性,沒有biggy。