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 个回答
3
有几种方法可以做到这一点。有些表单库会处理大部分基本的验证,但当数据比较复杂时,难免会遗漏一些东西。
我觉得把一组值放到模型的一个@classmethod
里去验证是个好主意。我通常会有一个类似于你提到的save_to_datastore()
的类方法,主要用来验证和组装要保存的数据,而不是在处理程序里直接做。我更喜欢在处理程序中不涉及特定的数据存储操作。例如,使用模型的类方法来查询,而不是直接在处理程序里创建查询。这样可以把模型当作一个接口来思考,更容易维护,也能更好地管理索引等。