2012-11-13 39 views
3
JSON错误

我想如下添加到API一个DELETE方法:尝试除瓶

if request.method == 'DELETE': 

    if request.headers['Content-Type'] == 'application/json': 

     try: 
      data = json.loads(request.data) 
      data_id = data['id'] 
      db.execute('DELETE FROM places WHERE id=' + data_id) 
      db.commit() 
      resp = Response({"Delete Success!"}, status=200, mimetype='application/json') 
      return resp 

     except (ValueError, KeyError, TypeError): 
      resp = Response({"JSON Format Error."}, status=400, mimetype='application/json') 
      return resp 

我传递了以下卷曲:

curl -H "Content-type: applicaiton/json" -X DELETE http://localhost:5000/location -d '{"id":3}' 

除了块的尝试失败因为某些原因。我无法检测到问题所在。任何想法如何我可以调试呢?

+0

您是否看到异常被提出?另外,如果没有id为'data_id'的项,你可能会考虑返回404而不是400 – Andbdrew

+0

它返回错误400,因此我相信会引发一个异常。 – darksky

+0

或'contentType'? –

回答

0

如果更改

except (ValueError, KeyError, TypeError): 
    resp = Response({"JSON Format Error."}, status=400, mimetype='application/json') 
    return resp 

except (ValueError, KeyError, TypeError) as error: 
    print error 
    resp = Response({"JSON Format Error."}, status=400, mimetype='application/json') 
    return resp 

,你将能够看到您的错误。

更新:我很高兴你发现你的错误!我想大多数模块包装数据库连接,可以这样做:

db.execute('SELECT * FROM awesome_table WHERE id=%s', data_id) 

,他们通常会提供一些基本的SQL注入防护。

+0

谢谢!有一件事情可以在以后看到:如果我正在开发一个仅限JSON的API,则Flask中的print不会真正将其打印出来。我用return repr(error)来查找我的错误。我的错误是在db.execute中,连接一个str和int对象。 – darksky