Flask中使用Flask-WTF验证JSON对象参数

文章介绍了在Flask中如何利用Flask-WTF扩展对通过JSON传递的参数进行验证。首先,需要安装Flask-WTF包。然后,自定义RequestForm类,根据Content-Type判断请求类型,分别处理JSON和表单数据。接着,定义了TestForm表单类,包含字段验证规则。在main.py中,创建Flask应用并处理POST请求,通过TestForm进行参数验证并返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask中使用Flask-WTF验证JSON对象参数

1 安装

Flask-WTF是对WTForms库的扩展,默认只对”form“标签下的表单进行验证。针对当前前后端分离的项目中,json传输参数需要进行二次封装才能使用。

# 安装Flask-WTF包
pip install Flask-WTF

2 源代码

2.1 工程布局

在这里插入图片描述

2.2 实体类

request_form.py

# coding=utf-8

from flask import request
from wtforms import Form


# 自定义请求
class RequestForm(Form):
    # 初始化参数
    def __init__(self):
        # 获取 “application/json” 请求
        if "application/json" in request.headers.get("Content-Type"):
            data = request.get_json(silent=True)
            args = request.args.to_dict()
            super(RequestForm, self).__init__(data=data, **args)
        else:
            # 获取 “application/x-www-form-urlencoded” 或者 “multipart/form-data” 请求
            data = request.form.to_dict()
            args = request.args.to_dict()
            super(RequestForm, self).__init__(data=data, **args)

    def validate_arguments(self):
        # 验证参数
        valid = super(RequestForm, self).validate()

        # 验证参数失败
        if not valid:
            # 此处可以写错误返回值
            print("field is require")

        return self.validate()

    def arguments_error(self):
        return result(data=self.errors, code=400, msg="Parameter error")

decorator_form.py


def decorator_form(form_object):
    # 设置含有请求参数的装饰器
    def inner(fun):
        def inner_sub(*args, **kwargs):
            # 构建实例
            form_instance = form_object()

            # 验证参数
            if not form_instance.validate_arguments():
                return form_instance.arguments_error()

            return fun(*args, **kwargs)

        # 更改视图名称
        inner_sub.__name__ = fun.__name__

        return inner_sub
    return inner

test.py

from wtforms import StringField
from wtforms.validators import DataRequired, length

from entity.request_form import RequestForm


# TestForm表单
class TestForm(RequestForm):
    # 会自动生成标签
    # <input id="name" required type="text" value="参数值">
    name = StringField(validators=[DataRequired()])

    # 会自动生成标签
    # <input id="pwd" maxlength="12" minlength="6" name="pwd" required type="text" value="参数值">
    pwd = StringField(validators=[DataRequired(), length(min=6,max=12)])

    def get_name_data(self):
        return self.name.data

    def get_pwd_data(self):
        return self.pwd.data

result.py


import json

from flask import jsonify


def result(data: object = None, code: int = 200, msg: str = "success"):
    """
    Set the result of web
    :param data: It is data of status
    :param code: It is code of status
    :param msg: It is a message of status
    :return: dict
    """

    # 将对象转化为json字符串
    data_json_str = json.dumps(data, ensure_ascii=False, default=lambda obj: obj.__dict__)

    # 将json字符串转化为json字典
    data_json_dict = json.loads(data_json_str)

    # 设置返回值字典
    result_dict = {
        "code": code,
        "msg": msg,
        "data": data_json_dict
    }

    return jsonify(result_dict)

2.3 main.py

flask应用

from flask import Flask
from entity.test import TestForm

app = Flask(__name__)


@app.route("/", methods=['POST'])
@decorator_form(TestForm)
def test():
    # 获取Form表单
    test_form = TestForm()
    # 添加decorator_form后,不需要在代码里做验证
    # if not test_form.validate_arguments():
    #    return test_form.arguments_error()

    print(test_form.get_name_data())
    print(test_form.get_pwd_data())

    return "Success"


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

3 应用请求

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值