2012-04-18 144 views
16

我想在Flask中做一個簡單的API,第一步是獲取POST JSON數據。 (我只想現在打印它)這是我的代碼,當我用json數據請求/ api時,它返回一個500錯誤。任何想法爲什麼發生這種情況?Flask POST請求導致服務器崩潰

from flask import Flask, request, Response 
app = Flask(__name__) 

@app.route('/') 
def root_response(): 
    return "Hello World." 

@app.route('/api', methods=['POST', 'GET']) 
def api_response(): 
    if request.method == 'POST': 
     return request.json 

if __name__ == '__main__': 
    app.run() 

curl命令:

$ curl -H "Content-Type: application/json" --data @body.json http://127.0.0.1:5000/api 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>500 Internal Server Error</title> 
<h1>Internal Server Error</h1> 
<p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p> 

body.json:

{ 
"please": "print", 
"me": "now" 
} 

回答

24

首先,你需要做的是啓用調試模式,使瓶實際上將告訴你是什麼錯誤。 (你會得到瓶中的好處重裝每次修改代碼的時間!)

if __name__ == '__main__': 
    app.debug = True 
    app.run() 

然後我們發現我們的錯誤:

TypeError: 'dict' object is not callable 

你返回request.json,這是一個字典。您需要先將其轉換爲字符串。這很容易做到:

def api_response(): 
    from flask import jsonify 
    if request.method == 'POST': 
     return jsonify(**request.json) 

你有! :)

+1

該調試模式爲我節省了很多時間:D – 2015-06-15 07:40:43

+0

調試的其他設置,因爲我發現,儘管調試設置爲True,我沒有得到屏幕上的錯誤消息。 – disruptive 2015-09-02 17:53:27

+0

我實際上已經意識到所有的錯誤信息都被輸出到我運行服務器的終端。然而,調試模式證明對其他測試有幫助(並且它可以在你運行curl命令的地方打印出來) – alisa 2017-01-17 19:35:25