3

私はAPIを作成しており、JSONでデータを期待しています。私の関数はうまく機能し、次のようにSQLiteにデータを保存します。

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フィールド(、、、または)がないPOSTを送信するとlat、Flasklongによってエラーがスローされます。addressname

これを処理するための最良の方法は何ですか?

私はやってみました:

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

しかし、これdataは単なる文字列であり、辞書ではありません。だから私は2つの質問があります:

  1. 上記の辞書のように、どのようにファイルが参照されていますか(data['lat']...)?
  2. このエラーを処理する適切な方法は何ですか?
4

1 に答える 1

10

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が正しいキーを持つ辞書でない場合、例外が発生します。リストされている3つの例外は、考えられるさまざまなエラーモードによって発生するものです。

>>> 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'
于 2012-11-10T22:31:03.107 に答える