2012-11-10 69 views
2

我正在編寫一個API並期望JSON中的數據。我的功能運作良好,並存儲數據在SQLite作爲如下:在Flask中處理POST JSON錯誤

if request.method == 'POST': 
    if request.headers['Content-Type'] == 'application/json': 
     db = get_db() 
     data = json.loads(request.data) 
     row = (data['lat'], data['long'], data['address'], data['name']) 
     db.execute('INSERT INTO places (lat, long, address, name) values (?, ?, ?, ?)', row) 
     db.commit() 
     resp = Response(status=200, mimetype='application/json') 
     return resp 

如果有人給使用不正確的JSON字段(失蹤latlongaddressname)訊息,然後一個錯誤被扔瓶。

處理這個問題的最佳方法是什麼?

我試着這樣做:

if not 'lat' in data or if not 'long' in data or .... 

data只是一個字符串,而不是一本字典。所以,我有兩個問題:

  1. 如何是申請被引用,彷彿是一本字典以上(data['lat'] ...)?
  2. 什麼是處理此錯誤的適當方法?
+0

請求*可能*是某種不能解碼爲字典的東西,的確如此,請參閱答案。 –

回答

7

從JSON加載數據到data = json.loads(request.data)的那一刻,您就有了python結構。

如果當時它是而不是一個字典,那麼無論發送的請求是什麼,你都沒有保存正確的JSON結構(例如可能是一個列表)。

我會使用一個try/execept在這種情況下:

try: 
    data = json.loads(request.data) 
    row = (data['lat'], data['long'], data['address'], data['name']) 
except (ValueError, KeyError, TypeError): 
    # Not valid information, bail out and return an error 
    return SomeErrorResponse 

如果request.data不是有效的JSON,或者如果data是不正確的密鑰字典裏,將引發異常。列出的三個例外是可能由各種錯誤模式引發的內容:

>>> import json 
>>> json.loads('nonsense') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 319, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/json/decoder.py", line 338, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 
>>> 'ouea'['abc'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string indices must be integers, not str 
>>> [0]['oue'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 
>>> {}['oue'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'oue'