2014-12-13 58 views
0

我正在嘗試使用GET,POST,PUT功能編寫API的Web控制器。 1.在處理請求的方法中,特別是POST和PUT,我想驗證請求主體中是否存在所需的鍵/字段。 2.我也想檢查請求頭中存在的授權密鑰並將未經授權的錯誤等作爲響應。如何在Python中驗證POST請求的json/xml正文

在python中是否有這樣做的優雅方式,寫入多個if...else看起來不太優雅。

我有以下的代碼處理請求體:

from werkzeug.wrappers import BaseResponse as Response 
. 
. 
. 
    root = ET.fromstring(data) 
      for child in root: 
       order_completed_date = child.find('Order_Completed_Date') 
       if order_completed_date is None: 
        #return json.loads({"status":"400", "message":"Order_Completed_Date is missing"}) 
        return Response('Bad Request, Order_Complete_At missing', status=400) 
       else: 
        order_completed_date = order_completed_date.text 
       order_id = child.find('Order_Number') 
       if order_id is None: 
        return Response('Bad Request, Order_Number missing', status=400) 
       else: 
        order_id = order_id.text 
       product_id =child.find('SKU') 
       if product_id is None: 
        return Response("Bad request, SKU is missing", status=400) 
       else: 
        product_id = product_id.text 
       . 
       . 
       . 

所以,我正在寫,如果其他每個字段

+0

什麼是 「不優雅」 關於具有檢查鍵和檢查AUTH第二'if'語句中的'if'聲明? (另外,我不確定爲什麼你需要任何'else',如果你打算在失敗時引發異常。)也許如果你能向我們展示一些[最小示例代碼](http://stackoverflow.com/help/mcve)並解釋你不喜歡的內容,你可以得到更好的答案。 – abarnert 2014-12-13 05:17:32

+0

@abarnert:謝謝你的迴應。我在請求體中有多個文件 - 17.因此,我必須爲每個字段編寫if語句並引發適當的響應。 – nish 2014-12-13 05:20:29

+0

@abarnert:我更好地分享了一些代碼 – nish 2014-12-13 05:25:13

回答

1

我們已經有了一些代碼,所以我們可以看看如何重構它。

基本上只是對這個代碼的微小變化一遍又一遍:

order_completed_date = child.find('Order_Completed_Date') 
if order_completed_date is None: 
    #return json.loads({"status":"400", "message":"Order_Completed_Date is missing"}) 
    return Response('Bad Request, Order_Complete_At missing', status=400) 
else: 
    order_completed_date = order_completed_date.text 

那麼,我們怎麼可能把它轉換成一個功能?

首先,只是把它變成一個功能,看看有什麼地方錯了:

def find_key(): 
    order_completed_date = child.find('Order_Completed_Date') 
    if order_completed_date is None: 
     return Response('Bad Request, Order_Complete_At missing', status=400) 
    else: 
     order_completed_date = order_completed_date.text 

所以,第一個問題是:child值。這不是一個常數;每次循環的時間是不同的,所以我們需要把這個當作一個參數。*

*好了,我們可以定義find_key當地,並得到child爲閉包變量,但是讓我們保持它的簡單,現在。

同樣,雖然'Order_Completed_Date'每次循環的時間不一樣,它是每一個不同的密鑰不同,所以我們需要這一點。*

*還有是一個'Order_Complete_At'字符串,但這似乎是'Order_Completed_Date'的拼寫錯誤。如果不是,那麼您需要添加另一個參數,例如key_error_name,您可以使用該參數。

變量名order_completed_date改變,因爲如果我們把它作爲「的值的通用名稱局部變量名稱不意味着什麼Python的,但它顯然誤導人類讀者爲每個鍵「。

最後,大問題是我們返回。我們有兩種不同的東西可以返回 - 一個節點的文本或一個錯誤響應。前者爲return,後者爲raise。或者返回一對東西,一個文本或錯誤和一個標誌,告訴我們哪個是哪個。或者我們可能會返回一個文本和一個錯誤,其中之一是None。異常看起來是最複雜的,但它自動給我們提供了一個「非本地返回」,這是一種突破功能其餘部分的方法,無需逐個檢查每個返回值。

所以:

def find_key(child, key): 
    value = child.find(key) 
    if value is None: 
     raise KeyError(key) 
    else: 
     return value.text 

現在:

try: 
    for child in root: 
     order_completed_date = find_key(child, 'Order_Completed_Date') 
     order_id = find_key(child, 'Order_Number') 
     product_id = find_key(child, 'SKU') 
     # ... 
except KeyError as e: 
    return Response("Bad request, {} is missing".format(e.args[0]), status=400) 
+0

。但是,假設如果缺少三個鍵,它將首先爲第一個鍵引發錯誤。一旦糾正後,第二個鍵的錯誤就會被拋出。有沒有一種方法可以使用元素樹來查找給定孩子中的所有標籤?如果是這樣,在一個函數中,我們可以返回所有丟失的鍵? – nish 2014-12-13 06:26:11

+0

好吧,我明白了http://stackoverflow.com/a/10409082/2388940 – nish 2014-12-13 06:30:19

+0

感謝或幫助abarnert – nish 2014-12-13 06:30:45