Google App Engine中的验证逻辑

时间:2011-02-25 17:41:08

标签: python model-view-controller google-app-engine

我编码的应用程序的一部分结构大致如下:

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形式吗?

1 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点。某些表单库将执行大部分基本验证,但是当您拥有更复杂的数据时,某些内容将不可避免地被遗漏。

我认为将值字典传递给模型的@classmethod是个好主意,让它验证数据。我通常有一个像save_to_datastore()这样的类方法,主要用于验证和组装要保存的实体,而不是在处理程序中执行它。我更喜欢在处理程序数据存储区中没有特定的东西。例如:使用模型类方法进行查询,而不是直接在处理程序中创建查询。它使您将模型视为api,更易于维护和跟踪索引等。