Python Flask RESTful与Flask WTF表单集成

Python Flask RESTful与Flask WTF表单集成,python,django,flask,flask-wtforms,flask-restful,Python,Django,Flask,Flask Wtforms,Flask Restful,我正在使用Flask和Flask RESTful。我有获取数据的POST方法,我需要对其进行验证检查。 我的问题是,我是否可以将Flask-WTF与类似Django表单一起用于处理验证和检查 对于我需要检查系统中是否已经存在电子邮件的注册场景,您更喜欢哪种技术?Flask RESTful的reqparse模块提供了您需要的内容。通过定义自己类型的输入字段,可以执行一些验证操作。以下是一个从头开始的示例: from flask import Flask from flask.ext.restful

我正在使用
Flask
Flask RESTful
。我有获取数据的POST方法,我需要对其进行验证检查。 我的问题是,我是否可以将
Flask-WTF
与类似
Django表单
一起用于处理验证和检查


对于我需要检查系统中是否已经存在电子邮件的注册场景,您更喜欢哪种技术?

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个错误请求

您可以在RESTful的烧瓶中找到更多信息

同样,您可以使用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。例如,WTForms从模型生成表单的方式与Django ORM模型类似。

我认为您可以使用,这也可能取决于您的需要。由于
reqparse
现在已被弃用,这个问题现在重新讨论。需要另一个模块,那么webargs、wtforms?wtforms支持也能得到吗?CRSF的兼容性?如果有20个字段需要验证,我的意思是有20个字段是必需的True,你会为每个字段添加参数吗?事实上,如果你想像Django那样自动将表单字段映射到模型字段,我的解决方案不是你想要的。为此,您可以使用WTForms及其一个扩展来处理您的ORM。因此,表单的字段将自动生成,并且根据您使用的ORM,扩展将尝试根据字段类型猜测可能需要的验证。尽管如此,您仍然需要定义一个来执行对电子邮件字段的检查。我试图使用那些wtf表单,当我检查request.form时,它等于
None
,因为请求来自API,并且有json数据。我在
request.data
中获取参数,但当我传递实例MyForm(request.data)时,它会生成错误。你知道任何使用API+WTForms的例子(我也搜索过)吗?@Jack:我更新了我的答案,为WTForms提供了一个例子。