在面向对象系统的分析与设计过程中经常会遇到这样一种情况: 一个流程可以分为A,B,C….多个步骤,但在具体的步骤中可能会有不同的情况出现,这时就Template模式就非常有用:
class P(object):
def a():
pass
def b():
pass
def operate():
a()
b()
class Sub(P):
def a():
print 'a in sub'
def b():
print 'b in sub'
class Suba(P):
def a():
print 'a in suba'
def b():
print 'b in suba'
也就是说在父类中定义流程的细节,步骤的接口,在子类中无需管流程的细节,只要实现步骤的细节即可以满足功能的需求了。
最近做的一个Flask项目就用到了Template模式,在route中接受到的post请求需要验证,而wtf已经提供了一些基本格式的验证,这时想把一些功能上的验证也做到里面去,不讨论这么做是不是符合面向对象的一些原则,在这个项目中很方便也不会有问题就好!于是新建了一个类:
class AgentForm(Form):
status = 0
msg = ''
domain = ''
user_id = ''
def set_domain(self, domain):
self.domain = domain
def set_user_id(self, user_id):
self.user_id = user_id
def validate_logic(self):
return True
def validate(self):
if self.validate_logic(): # subclass validation is OK, run the basic validation for format
if not super(AgentForm, self).validate():
self.status = FORMAT_VALIDATION_FAILED_RET
errors = deepcopy(self.errors)
if 'csrf_token' in errors:
del errors['csrf_token']
for value in errors.itervalues():
self.msg += string.join(value, sep=' ')
self.msg += '\n'
self.msg = self.msg[0:len(self.msg)-1]
# self.msg = str(self.errors)
return False
return True
return False
这个类的目的在于将wtf本身的验证信息返回到成员变量status,msg里面来,方便调用者获取。同时提供validate_logic函数接口,子类只需要重载validate_logic函数,并在出现错误时为status,msg赋值即可。子类示例:
class ForgetPwdForm(AgentForm):
email = StringField('email', validators=[
DataRequired(message=u'请填写者电子邮件'),
Email(message=u'Email格式不正确')
])
def validate_logic(self):
user = User.query.filter_by(email=self.email.data, domain=self.domain).first()
if not user:
self.status = 1
self.msg = u'此账号不存在'
return False
return True