最近用的flask框架写了个网站,目前要在app上也在同步开发,服务端的一些业务逻辑是相同的,只是有些行为比如返回结果不同,web上需要返回一个跳转的url,app上需要返回json格式的数据,这种情况用简单工厂模式比较合适,小文章,直接上代码:
基类,以login为例,校验用户名密码,返回return code和错误信息
class UserService(object):
def __int__(self):
return
def login_post(self):
form = CMSLoginForm(flask.request.form)
if form.validate():
phone = form.phone.data
password = form.password.data
user = CMSUser.query.filter_by(phone=phone).first()
remember = form.remember.data
if user and user.check_pwd(password):
flask.session[CMS_SESSION_ID] = user.id
if remember:
flask.session.permanent = True
else:
flask.session.permanent = False
return HttpCode.ok,''
else:
return HttpCode.paramserror, u'邮箱或密码错误'
else:
return HttpCode.paramserror, form.get_error()
子类继承UserService,先调用父类完成校验,然后根据返回码,返回不同的结果,url跳转或是json格式的结果
class WebUser(UserService):
def __int__(self):
return
def login_post(self):
retcode,message = super(WebUser, self).login_post()
if retcode == HttpCode.ok:
return redirect(url_for('cms.cms_index'))
else:
return render_template('cms/login.html',messages= message)
class MobileUser(UserService):
def __int__(self):
return
def login_post(self):
retcode, message = super(MobileUser, self).login_post()
if retcode == HttpCode.ok:
return json_result()
else:
return json_params_error(message=message)
使用的时候,先初始化两个工厂类
webuser = WebUser()
mobileuser = MobileUser()
在视图函数中,根据需求调用相应的对象即可
from service_helper.user_service import webuser as userhelper
@bp.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET':
return flask.render_template('cms/login.html')
if request.method == 'POST':
return userhelper.login_post()
很简单,很实用,易扩展