2012-11-10 8 views
2

API를 작성 중이며 JSON에서 데이터를 예상하고 있습니다.Flask에서 POST JSON 오류 처리

사람이 ( lat, long, address 또는 name 누락) 잘못된 JSON 필드와 POST 보내는 경우
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 

, 다음 오류가 플라스크에 의해 발생합니다 다음과 같이 내 기능 SQLite는 잘 저장 데이터를 사용할 수 있습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

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)으로로드하는 순간에는 파이썬 구조가 있습니다.

그 당시에는 이 아니고 사전 인 경우 요청이 무엇이든지 올바른 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'