Flask-RESTful 的reqparse 模块提供了您正在寻找的东西。通过定义自己的输入字段类型,您可以执行一些验证操作。这是一个从头开始的例子:
from flask import Flask
from flask.ext.restful import Api, Resource, reqparse
app = Flask(__name__)
api = Api(app)
def is_email_valid(address):
# Check if the e-mail address already exists in database.
return True # or False
def email(value):
if not is_email_valid(value):
raise ValueError("The e-mail address {} is already taken.".format(value))
return value
class Users(Resource):
parser = reqparse.RequestParser()
parser.add_argument('email', type=email, help='Signup email')
def post(self):
args = self.parser.parse_args()
# Create the new user with args.items()
return "user representation", 201
api.add_resource(Users, '/users')
if __name__ == '__main__':
app.run(debug=True)
如果参数未能通过验证,解析器会自动响应 400 Bad Request。
您可以在 Flask-RESTful 的documentation 中找到更多信息。
同样,您可以使用 WTForms 做到这一点:
from flask import Flask, request
from flask.ext.restful import Api, Resource, abort
from wtforms import Form, fields, validators
app = Flask(__name__)
api = Api(app)
# WTForms
def is_email_valid(address):
# Check if the e-mail address already exists in database.
return True # or False
def user_email(form, field):
if not is_email_valid(field.data):
raise validators.ValidationError("The e-mail address {} is already taken.".format(field.data))
class UserForm(Form):
email = fields.StringField('Email', [validators.Email(), user_email])
# Flask-RESTful
class Users(Resource):
def post(self):
form = UserForm(data=request.get_json())
if form.validate():
# Create the new user with form.populate_obj()
pass
else:
abort(400)
return "user representation", 201
api.add_resource(Users, '/users')
if __name__ == '__main__':
app.run(debug=True)
但是,即使使用 WTForms 实现,您也必须定义表单的字段,除非您使用兼容的 ORM。例如,some extensions 的 WTForms 从模型生成表单的方式与 Django ORM 模型类似。