class MainHandler(tornado.web.RequestHandler): form = SubmitForm(id=fields.Integer(required=True, _min=2), text=fields.EnStr(data_key='search', required=False), test=fields.Boolean(required=False, default=True), status=fields.Integer(required=True, validate=OneOf((1, 2))), stime=fields.StartDate(required=False, default=get_now_date), etime=fields.EndedDate('stime', default=get_now_date), user=fields.Nested(UserSchema, required=False), ids=fields.IntList(min_len=0, max_len=3, required=False, when_field='test', when_value=fields.Boolean.real)) async def validate(self): data, error = await self.form.bind(self) if error: return self.write(json.dumps({'state': 'FAIL', 'error': error})) return self.write(json.dumps({'state': 'SUCCESS', 'data': data})) async def post(self): return await self.validate() async def get(self): return await self.validate()
test command curl http://localhost:8888?id=2\&name=aiohttp curl http://localhost:8888 -X POST -d "id=2&name=aiohttp" ''' class UserField(fields.Integer): cvt_type = None async def _validate(self, value, attr, data): val = random.randint(1, 10) / 100 await asyncio.sleep(val) return {'uid': value, 'name': f'user_{value}'} form = SubmitForm(id=fields.Integer(required=True, _min=1), name=fields.Str(required=True, length=(3, 20)), user=UserField(required=True)) async def handle(request): data, error = await form.bind(request) if error: return web.json_response(data=error, status=400) return web.json_response(data=data) app = web.Application() app.add_routes([web.get('/', handle), web.post('/', handle)]) if __name__ == '__main__':
class UserForm(Form): id = fields.Integer(required=True, _min=2) uname = fields.Username(required=True, length=(4, 20)) stime = fields.StartDate(required=True) etime = fields.EndedDate('stime', required=True) roles = fields.IntList(required=True)
class UserSchema(schema.Schema): uid = fields.Integer(required=True) name = fields.Username(required=True, length=(4, 20))