2015-04-14 41 views
4

我有一個燒瓶服務器上運行在pythonanywhere我試圖寫一個python腳本,我可以在本地運行這將觸發一個特定的響應 - 可以說服務器時間,爲了這個討論。 有關如何編寫此過程的Flask服務器端的文檔和噸,但如何編寫可觸發Flask應用程序運行的內容卻很少/很少。 我曾嘗試以簡單的curl命令的形式發送XML,例如POST瓶服務器與Python的XML

curl -X POST -d '<From>Jack</From><Body>Hello, it worked!</Body>' URL 

但是,這似乎並沒有工作(有關引薦標題的錯誤)。

有人可以讓我知道正確的方式來編寫一些可以發送到監聽燒錄服務器的XML。

感謝,

傑克

回答

5

首先,我會捲曲調用,這樣服務器就知道什麼期望添加-H "Content-Type: text/xml"的頭。如果您發佈了服務器代碼(不一定是所有內容,但至少發生了什麼問題),這將會很有幫助。

要調試這個我會用

@app.before_request 
def before_request(): 
    if True: 
     print "HEADERS", request.headers 
     print "REQ_path", request.path 
     print "ARGS",request.args 
     print "DATA",request.data 
     print "FORM",request.form 

這是一個有點粗糙,但有助於看看發生了什麼事情在每個請求。在調試時根據需要使用if語句打開和關閉它。

在cURL調用中運行沒有xml頭的請求會將數據發送到request.form字典。添加XML頭部定義會導致數據出現在request.data中。不知道你的服務器在哪裏出現故障,上面應該至少給你提示如何繼續。

編輯指以下評論:

我會用出色的xmltodict庫。這種捲曲呼叫

import xmltodict 
@app.before_request 
def before_request(): 
    print xmltodict.parse(request.data)['xml']['From'] 

:使用此測試

curl -X POST -d '<xml><From>Jack</From><Body>Hello, it worked!</Body></xml>' localhost:5000 -H "Content-Type: text/xml" 

'傑克' 打印出來沒有問題。

請注意,此調用已從您的問題中修改 - 添加了'xml'標記,因爲XML需要根節點(出於某種原因,它被稱爲xml )。沒有這個標籤,你會從xmltodict(或你選擇的其他解析器)中得到一個解析錯誤。

+0

好了,所以當我添加的內容類型和before_request叫我回去: REQ_path /測試 ARGS ImmutableMultiDict([]) 數據傑克 FORM ImmutableMultiDict([]) 於是我想我的現在的問題是,我如何從Flask內部獲得'name'(我已經嘗試了request.data和request.DATA.name等),並且隨後將如何通過XML中的ARGS(例如,如果我想要我的服務需要用戶名和密碼)Cheers @GC_Python – JMzance

+1

@JMzance,請參閱編輯原始答案。 –