2014-01-07 42 views
2

我剛開始對我的一個項目使用Pyramid,並且我需要通過獲取表單字段值並進行Web服務調用以確認值的正確性,以驗證表單域輸入。例如,有一個字段叫做你的銀行的CUSTOMER-ID。我需要將(單獨)作爲輸入,並通過發出Web服務調用(如http://someotherdomain/validate_customer_id/?customer_id=<input_value>)讓服務器級別進行驗證。哪一個是表單驗證的正確方法? Colander的Schema驗證或Deform的表單驗證?

我對錶單模式管理使用Colander,對於所有表單驗證邏輯使用Deform。我很困惑我需要在CUSTOMER-ID情況下放置我的驗證邏輯。是否在MySchema().bind(customer_id=<input_value>)(它有一個延遲驗證器查詢Web服務)或者form.validate(request.POST.items())?如果我採用延遲驗證程序的路徑,則MySchema().bind對於錯誤的CUSTOMER-ID正在引發colander.Invalid錯誤。沒關係。但是這個錯誤並不在表單層面,而是在模式層面。那麼我怎麼會以一種理智的方式告訴用戶這件事?

我對Django窗體有很好的使用經驗,所以我期待着像clean這樣的方法。像表單['customer_id']。錯誤是我期望在模板級別。金字塔的Deform或Colander可能嗎?

回答

8

所以我認爲你遇到的最大問題是理解Colander和Deform關注的分離。 Colander是人們喜歡稱之爲通用模式驗證庫的東西。這意味着我們定義一個模式,其中每個節點都有一個特定的數據類型,並且一些節點可能是必需/可選的。然後,Colander能夠驗證該模式,並告訴我們我們傳遞給漏勺的數據是否符合該模式。舉個例子,在我的網絡應用程序中,我經常構建apis,接受需要驗證的GET/POST參數。因此,在金字塔,讓我們說我有這樣的場景:

request.POST = { 
    'post_id': 1, 
    'author_id': 1, 
    'unnecessary_attr': 'stuff' 
} 

然後我就可以驗證它就像這樣:

# schema 
schema = SchemaNode(Mapping(), 
        SchemaNode(Integer(), name='post_id'), 
        SchemaNode(Integer(), name='author_id')) 
schema.deserialize(request.POST) 

如果它不能將數據符合指定的模式就會報錯。所以你可以看到,漏勺實際上可以用來驗證任何一組數據,無論是來自POST/GET/JSON數據。另一方面,變形是一個表單庫,並可幫助您創建/驗證表單。它使用漏勺滿足所有的驗證需求,並且它幾乎完全委託驗證漏勺。所以爲了回答你的問題,你會用漏勺完成所有的驗證工作,而變形將主要處理你的表單渲染。

+2

謝謝。現在很清楚。但是,如果模式驗證失敗,我將如何報告這種錯誤?就像告訴用戶「輸入無效的CUSTOMER_ID」一樣?因爲它們處於兩個不同的層次。 –

+0

這是一個非常好的答案。 +1 –

+0

@漏洞在生態系統中,您想要更改的消息在驗證器級別定義,即https://github.com/Pylons/colander/blob/master/colander/__init__.py#L314。當你實例化他們時,他們中的一些人接受「消息」kwarg,有些則不。 – JayD3e

2

要查看一個生動的金字塔示例應用程序和變形行爲,請將todopyramid作爲IndyPy Python Web Shootout的一部分。 todo應用程序在金字塔,Django,燒瓶和瓶子中實施。我研究了金字塔示例 - 寫得很好,顯示變形架構驗證並使用引導來顯示驗證消息。

查找更多金字塔教程here