2012-12-08 26 views
5

HTML中返回的異常中斷我的JSON客戶端。我想對這個輸出進行jsonify。Flask中的API - 返回JSON,但HTML異常中斷我的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格式顯然是默認的,但我不知道如何退出它並指定jsonified異常(並且理想情況下,即使標題返回也會進行jsonify)。

我懷疑我需要的是在優秀的Flask文檔中的某處,但我找不到它。

+0

所以你試圖保存錯誤信息並將它們作爲JSON發送以防出現問題? – Blender

+0

@Blender,是的,這就是我想要的。 – doug

回答

4

使追溯可用於JSON客戶端可能會泄露敏感信息。

我的建議是:

  • 反過來調試過的
  • 安裝像sentry
  • 日誌聚合工具,讓該應用程序的錯誤500頁JSON格式返回一般性錯誤

500頁可能看起來像:

{ "error": "500 - internal server error" } 
+0

這是OP應該做的。 – sberry

1

下面的代碼應該可以做到。所以這個想法是捕獲可能發生的異常,使用traceback模塊獲取格式爲字符串的異常詳細信息,然後將其作爲有效的json返回。我建議將一堆except語句與預期發生的主要類型的錯誤以及更易讀的錯誤消息一起使用。然後你可以有最後一個,除非作爲一個捕獲所有萬一奇怪和意外的事情發生。

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") 
+0

即使else部分可以有jsonify,當user_id不在參數中時,它會再次返回html。 – Codeanu

+0

@Codeanu很好的建議,我用你的建議更新了答案。 –

6

你應該定義HTTP error handlers in flask.

一個簡單的JSON returing 404處理器可能是這個樣子:

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

有了這個,你將能夠檢查data.error在客戶端上,如果它存在,你可以通過data.text獲取錯誤文本(錯誤作爲e傳遞的錯誤是werkzeug.exceptions.NotFound,其字符串表示形式爲「404:Not Found」)。

相關問題