Flask表单验证返回空值求助:POST请求后字段值为None
Flask-WTF表单提交后返回None值问题解决
问题描述
使用Flask和Flask-WTF实现表单验证,代码如下:
from flask import Flask from flask_wtf import FlaskForm from wtforms import StringField, IntegerField app = Flask(__name__) app.config['WTF_CSRF_ENABLED'] = False class RegistrationForm(FlaskForm): email = StringField() phone = IntegerField() name = StringField() address = StringField() index = IntegerField() comment = StringField() @app.route('/registration', methods=['POST']) def registration(): form = RegistrationForm() if form.validate_on_submit(): email, phone = form.email.data, form.phone.data return fr"Successfully registered user {email} with phone +7{phone}" return f'Invalid input, {form.errors}', 400 if __name__ == '__main__': app.run(debug=True)
使用Postman发送POST请求到/registration接口时,返回内容为Successfully registered user None with phone +7None。
核心原因
- 表单字段无验证器:所有字段未配置验证规则,
validate_on_submit()会直接返回True,即使未传入任何参数,导致form.data全为None。 - 请求数据格式不匹配:若Postman使用JSON格式提交数据,FlaskForm默认仅解析
application/x-www-form-urlencoded或multipart/form-data类型的请求体,无法自动读取JSON数据。 - 缺少SECRET_KEY配置:Flask-WTF依赖该配置运行,即使关闭CSRF,部分版本仍要求设置。
解决方案
方案1:使用表单编码格式提交请求(推荐)
修改代码,添加验证器和SECRET_KEY:
from flask import Flask from flask_wtf import FlaskForm from wtforms import StringField, IntegerField from wtforms.validators import DataRequired, Email, Length app = Flask(__name__) app.config['WTF_CSRF_ENABLED'] = False app.config['SECRET_KEY'] = 'your-custom-secret-key' # 替换为自定义密钥 class RegistrationForm(FlaskForm): # 添加必填、格式验证规则 email = StringField(validators=[DataRequired(), Email(message="Invalid email format")]) phone = IntegerField(validators=[DataRequired(message="Phone number is required")]) name = StringField(validators=[DataRequired(), Length(min=2, message="Name must be at least 2 characters")]) address = StringField() index = IntegerField() comment = StringField() @app.route('/registration', methods=['POST']) def registration(): form = RegistrationForm() # 自动读取request.form中的数据 if form.validate_on_submit(): email, phone = form.email.data, form.phone.data return f"Successfully registered user {email} with phone +7{phone}" return f'Invalid input, {form.errors}', 400 if __name__ == '__main__': app.run(debug=True)
Postman操作步骤:
- 选择
POST方法,输入接口地址 - 在
Body选项卡中选择form-data或x-www-form-urlencoded - 添加参数:
email、phone、name等,参数名需与表单类字段名完全一致
方案2:支持JSON格式提交请求
若需要接收JSON数据,修改视图函数手动传入JSON数据:
from flask import Flask, request from flask_wtf import FlaskForm from wtforms import StringField, IntegerField from wtforms.validators import DataRequired, Email, Length app = Flask(__name__) app.config['WTF_CSRF_ENABLED'] = False app.config['SECRET_KEY'] = 'your-custom-secret-key' class RegistrationForm(FlaskForm): email = StringField(validators=[DataRequired(), Email()]) phone = IntegerField(validators=[DataRequired()]) name = StringField(validators=[DataRequired(), Length(min=2)]) address = StringField() index = IntegerField() comment = StringField() @app.route('/registration', methods=['POST']) def registration(): # 获取JSON数据,若无则返回空字典 request_data = request.get_json() or {} form = RegistrationForm(data=request_data) if form.validate_on_submit(): email, phone = form.email.data, form.phone.data return f"Successfully registered user {email} with phone +7{phone}" return f'Invalid input, {form.errors}', 400 if __name__ == '__main__': app.run(debug=True)
Postman操作步骤:
- 选择
POST方法,输入接口地址 - 在
Body选项卡中选择raw,格式选JSON - 传入JSON格式的参数:
{ "email": "test@example.com", "phone": 1234567890, "name": "Test User" }
内容的提问来源于stack exchange,提问作者Ubuty_programmist_7
相关产品推荐
相关产品推荐

