谷歌应用引擎中的验证逻辑

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表单吗?

1个回答

3
有几种方法可以实现。一些表单库会执行大部分基本验证,但是在处理更复杂的数据时,有些事情不可避免地被遗漏了。
我认为将一个值字典传递给模型的@classmethod是个好主意,并让它验证数据。我通常有一个类方法,就像你的save_to_datastore(),基本上用于验证和组装要保存的实体,而不是在处理程序中执行。我倾向于不在处理程序中使用特定于数据存储的内容。例如:使用模型类方法进行查询,而不是直接在处理程序中创建查询。这使您将模型视为api,更易于维护并跟踪索引等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接