【问题标题】:Flask-RESTful with Flask-WTF forms integrationFlask-RESTful 与 Flask-WTF 表单集成
【发布时间】:2015-05-18 09:13:20
【问题描述】:

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

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

【问题讨论】:

  • 我觉得你可以用,也可能看你的需要。
  • 由于reqparse 现已弃用,因此该问题现已重新提出。需要另一个模块,所以 webargs,wtforms? wtforms 也可以支持 GET 吗? CRSF的兼容性?

标签: python django flask flask-wtforms flask-restful


【解决方案1】:

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 模型类似。

【讨论】:

  • 如果您要验证 20 个字段怎么办,我的意思是有 20 个字段是必需的 True,你会 add_argument 每个字段吗?
  • 确实,如果您想像在 Django 中那样自动将表单的字段映射到模型的字段,我的解决方案不是您想要的。为此,您可以使用 WTForms 及其扩展之一来处理您的 ORM。因此,表单的字段将自动生成,并且根据您使用的 ORM,扩展程序将尝试根据字段类型猜测可能需要什么验证。尽管如此,您仍然需要定义 custom validator 来对电子邮件字段进行检查。
  • 我试图使用那些 wtf 表单,当我检查 request.form 它等于 None 因为请求来自 API 并且它具有 json 数据。我在request.data 中获得了参数,但是当我传递实例 MyForm(request.data) 时,它会产生错误。你知道任何使用 API + WTForms 的例子(我也搜索过)吗?
  • @Jack:我更新了我的答案,为 WTForms 提供了一个示例。
  • 嗯。 “请求”的事情看起来像是一种前进的方式,但我只是收到一个错误,说它不知道请求是什么。这真的不是一个实用的 api:/
猜你喜欢
  • 2016-04-22
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多