2011-02-25 94 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,更容易维护和跟踪索引等。