Google App Engine中的验证逻辑

3 投票
1 回答
701 浏览
提问于 2025-04-16 12:33

我正在编写的应用程序大致是这样的结构:

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()的类方法,主要用来验证和组装要保存的数据,而不是在处理程序里直接做。我更喜欢在处理程序中不涉及特定的数据存储操作。例如,使用模型的类方法来查询,而不是直接在处理程序里创建查询。这样可以把模型当作一个接口来思考,更容易维护,也能更好地管理索引等。

撰写回答