2011-02-25 74 views
3

部分的結構大致是這樣的:驗證邏輯,我編碼應用的

class PostModel(db.Model): 
    some_property = db.WhateverProperty() 
    some_other_property = db.WhateverProperty() 

class PostHandler(webapp.RequestHandler): 
    def get(self): 
     #code to generate form 
    def post(self): 
     #code to validate input from form 
     #create entity and put() it to datastore if input passes the validation 

現在,從我瞭解MVC,這個驗證邏輯應該在模型中,對不對?那麼,我應該這樣做嗎?

class PostModel(db.Model): 
    some_property = db.WhateverProperty() 
    some_other_property = db.WhateverProperty() 
    @staticmethod 
    def validation_logic(form_input): 
     #throw exceptions if validation fails 
    @staticmethod 
    def save_to_datastore(form_input): 
     #this would assume data already passed validation 
     #create entity and save it 

class PostHandler(webapp.RequestHandler): 
    def get(self): 
     #code to generate form 
    def post(self): 
     try: 
      PostModel.validation_logic(form_input) 
     except CustomException,e: 
      self.redirect('/errorpage?msg='+e.msg) 
     PostModel.save_to_datastore(form_input) 

這是不錯的MVC形式嗎?

回答

3

有幾種方法可以做到這一點。一些表單庫將完成大部分的基本驗證,但是當你有更復雜的數據時,一些事情不可避免地會被遺漏。

我認爲將值的字典傳遞給模型的@classmethod是個好主意,並讓它驗證數據。我通常有一個像你的save_to_datastore()這樣的類方法,基本上用於驗證和組裝一個要保存的實體,而不是在處理程序中執行它。我更喜歡在處理程序數據存儲中沒有特定的東西。例如:使用模型類方法進行查詢,而不是直接在處理程序中創建查詢。它使你認爲模型作爲一個API,更容易維護和跟蹤索引等。