由于项目需要使用tornado做开发,文鱼这几天认真看了下tornado的文档和之前项目现在的代码,但我看到之前项目里对post的验证逻辑,文鱼表示蛋很疼也表示理解。众所周知,tornado和django的理念完全不同:一个精悍,一个大而全。不想django中有forms这个表单类,所以验证需要自己去写
示例一下原项目代码:
def validate(self, data):
if type(data['msg']) != 'str':
return self.response_msg(ERROR, 'msg必须是字符串')
....
目测了下有二十多行-_-p,顿时一亿匹草泥马路过
所以打算重构下此部分代码,重构方案有三种:
1.自己封装forms类
2.移植下django中的forms类
3.找个轮子
第一种方案果断pass,第二方案当我读了下django源码瞬间感觉亚历山大(不得不说,django的封闭给我们提供了开发的便捷也限制了我们转其他框架的成本)。于是乎就google和github里找了下,突然想起以前看flask文档时里提到了WTForms的东东, 瞬间觉得这个世界的爱我又可以相信了。好了,说了太多废话,上干活。
#安装
pip install wtforms-tornado
基于django的习惯,建了个forms.py文件
#forms code
#wtforms文档参见http://wtforms.readthedocs.org/en/latest/
import wtforms
from wtforms import validators
from wtforms.validators import ValidationError
from wtforms_tornado import Form
class TestForm(Form)
msg = wtforms.StringField('msg', [validators.Length(min=4, max=23)])
def validate_msg(self, field):
if field.data != 'hello world':
raise ValidationError(u'Must be hello world')
下一步就是将form和handler结合了
from forms import TestForm
class TestFormHandler(tornado.web.RequestHandler):
def get(self):
pass
def post(self):
form = TestForm(self.request.arguments)
if form.validate():
self.write('ok')
else:
self.write(form.errors)
瞬间感觉代码简洁了多,顺便一说,在跑demo的是发现了一个件事,在此做个备忘吧
form_data = self.request.arguments #form_data数据是{'msg': ['helle world']}
form = TestForm(self.request.arguments) #form.data数据是{'msg': 'helle world'}