Flask-RESTful 与 Flask-WTF 表单集成

问题描述 投票:0回答:1

我正在使用

Flask
Flask-RESTful
。我有获取数据的 POST 方法,我需要对其进行验证检查。 我的问题是我可以使用
Flask-WTF
Django-Forms
来处理验证和检查吗?

对于

Signup
我需要检查系统中是否已存在电子邮件的场景,您更喜欢什么技术?

python flask flask-wtforms flask-restful
1个回答
3
投票

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 的文档中找到更多信息。

同样,您可以使用 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 模型的生成方式。

© www.soinside.com 2019 - 2024. All rights reserved.