2016-01-15 80 views
4

我正在研究我的第一個Flask應用程序(版本0.10.1),也是我的第一個Python(版本3.5)應用程序。它的一個作品都需要這樣的工作:燒瓶JSON要求是無

  1. 提交表單
  2. 運行芹菜任務(這讓一些第三方API調用)
  3. 當芹菜任務的API調用完成,發送一個JSON張貼到另一個網址的應用
  4. 獲取通過JSON數據,並更新其數據庫記錄

這裏的芹菜任務的相關部分:

if not response['errors']: # response comes from the Salesforce API call 
    # do something to notify that the task was finished successfully 
    message = {'flask_id' : flask_id, 'sf_id' : response['id']} 
    message = json.dumps(message) 
    print('call endpoint now and update it') 
    res = requests.post('http://0.0.0.0:5000/transaction_result/', json=message) 

而這裏的調用端點:

@app.route('/transaction_result/', methods=['POST']) 
def transaction_result(): 
    result = jsonify(request.get_json(force=True)) 
    print(result.flask_id) 
    return result.flask_id 

到目前爲止,我只是想獲取數據並打印ID,我會擔心以後的數據庫。

我得到不過的錯誤是這樣的:requests.exceptions.ConnectionError: None: Max retries exceeded with url: /transaction_result/ (Caused by None)

我讀表明我的數據可能不會過來的JSON,因此隊的結果= TRUE,但即使這似乎並沒有工作。我也嘗試在CocoaRestClient中使用application/json的Content-Type頭進行相同的請求,並得到相同的結果。

因爲這兩個嘗試都破壞了,所以我不知道我的問題是在請求中還是試圖解析響應。

回答

3

首先request.get_json(force=True)返回一個對象(如果是silent=True則返回None)。 jsonify將對象轉換爲JSON字符串。您正試圖訪問str_val .flask_id。不可能。但是,即使刪除多餘的jsonify電話後,您必須將result.flask_id更改爲result['flask_id']

所以,最終的代碼應該是這樣的:

@app.route('/transaction_result/', methods=['POST']) 
def transaction_result(): 
    result = request.get_json() 
    return result['flask_id'] 

你是絕對正確的,當你使用REST客戶端來測試路線。它通過減少相關部分來關鍵性地簡化測試過程。在從燒瓶應用程序向同一應用程序發送請求期間,一個衆所周知的問題是在開發服務器上僅使用一個線程運行此應用程序。在這種情況下,請求將始終被內部請求阻塞,因爲當前線程正在服務最外層請求,並且無法處理內層請求。但是,由於您正在從Celery任務發送請求,因此您的情況可能不太可能。

UPD:最後,最後一個原因是IP地址0.0.0.0。將它改爲真正的解決了這個問題。

+0

非常感謝。我不確定我以前是否嘗試過這種方式,但仍然會收到'requests.exceptions.ConnectionError:無:最大重試次數超過url:/ transaction_result /(由無引起)'錯誤,即使Celery任務能夠正確打印JSON。 –

+0

@JonathanStegall,嘗試將IP地址從0.0.0.0更改爲127.0.0.1或您的真實地址(如果有的話)。使用REST客戶端的結果是什麼? –

+0

它似乎終於有一次,我嘗試了一個測試Heroku的URL。也許我的本地版本有問題,因爲它不適用於localhost或127.0.0.1。 你想把它作爲答案,我可以接受嗎? –