覆盖 FlaskForm.validate() 不会让 POST 请求通过
Overriding FlaskForm.validate() doesn't let POST request through
摘要
除了一个字符串值之外,我正在尝试存储 3 个浮点值;但在此之前,我想通过相互检查来验证 FloatFields。
它们是 3 个指标 - 好、一般和差,我将 validators.NumberRange 包括在 [-1, 1] 中。这工作正常,所以如果我输入超出范围,我的模板中会显示默认错误消息,即在 -1 和 1
范围内输入
现在我必须在将它们添加到数据库之前验证 Good、Average 和 Poor 指标是否按降序排列。
代码
表格:
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, FloatField
from wtforms.validators import DataRequired, Length, ValidationError, NumberRange
from .models import Crop
# FORMS RENDERED TO CORRESPONDING WEB TEMPLATES IN DEFINED VIEWS
class CropForm(FlaskForm):
crop_name = StringField("Crop Name", validators=[DataRequired(), Length(max=80)])
good_threshold = FloatField("Good", validators=[DataRequired(), NumberRange(min=-1, max=1)])
average_threshold = FloatField("Average", validators=[DataRequired(), NumberRange(min=-1, max=1)])
poor_threshold = FloatField("Poor", validators=[DataRequired(), NumberRange(min=-1, max=1)])
submit = SubmitField("Submit")
def validate_crop_name(self, crop_name): # IGNORE THIS
crop = Crop.query.filter_by(crop_name=str(crop_name.data).casefold().replace(" ", "").capitalize()).first()
if crop:
raise ValidationError("Crop with the name already exists")
def validate(self, *args, **kwargs):
super(CropForm, self).validate(*args, **kwargs)
good_input = self.good_threshold.raw_data
average_input = self.average_threshold.raw_data
poor_input = self.poor_threshold.raw_data
if good_input < average_input:
self.average_threshold.errors.append("Average cannot be more than Good Indicator")
if good_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Good indicator")
if average_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Average indicator")
当我 remove/comment CropForm FORM 中的 validate() 块时,我能够将未验证的值(如 Good=0.5、Average=0.8、Poor=0.9)发送到数据库,这就是我我不喜欢,因为它们不是降序排列
当我保持原样时 is/uncomment,CropForm FORM 中的 validate() 块,发送可接受的值,如 Good=0.9、Average=0.8、Poor=0.5,然后我点击模板上的提交按钮,它根本不发送值 t db
型号:
class Crop(db.Model):
id = db.Column(db.Integer, primary_key=True, unique=True, nullable=False)
crop_name = db.Column(db.String, unique=True, nullable=False)
good_threshold = db.Column(db.Float)
average_threshold = db.Column(db.Float)
poor_threshold = db.Column(db.Float)
def __repr__(self):
return f"{self.id}.{self.crop_name}"
查看:
@app.route("/crops", methods=["POST", "GET"])
def crops():
form = CropForm()
if form.validate_on_submit():
crop_info = Crop(crop_name=str(form.crop_name.data).casefold().replace(" ", "").capitalize(),
good_threshold=form.good_threshold.data,
average_threshold = form.average_threshold.data,
poor_threshold=form.poor_threshold.data)
db.session.add(crop_info)
db.session.commit()
flash(f"Thresholds added, check record #{crop_info.id}", 'success')
return redirect(url_for('crops'))
records = Crop.query.order_by(Crop.id)
return render_template('crop_thresholds.html', title="Crop Thresholds", form=form, records=records)
您可以尝试将您的验证函数替换为这样的东西
def validate(self, *args, **kwargs):
super(CropForm, self).validate(*args, **kwargs)
good_input = self.good_threshold.raw_data
average_input = self.average_threshold.raw_data
poor_input = self.poor_threshold.raw_data
all_okay = True
if good_input < average_input:
self.average_threshold.errors.append("Average cannot be more than Good Indicator")
all_okay = False
if good_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Good indicator")
all_okay = False
if average_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Average indicator")
all_okay = False
return all_okay
想法是验证函数将根据返回的是 True
还是 False
来确定验证是否应该成功。因此,如果任何 if 语句失败,all_okay
将是 False
并且验证失败。否则验证应该通过并且您应该能够继续输入 if form.validate_on_submit():
代码块
摘要
除了一个字符串值之外,我正在尝试存储 3 个浮点值;但在此之前,我想通过相互检查来验证 FloatFields。
它们是 3 个指标 - 好、一般和差,我将 validators.NumberRange 包括在 [-1, 1] 中。这工作正常,所以如果我输入超出范围,我的模板中会显示默认错误消息,即在 -1 和 1
范围内输入现在我必须在将它们添加到数据库之前验证 Good、Average 和 Poor 指标是否按降序排列。
代码
表格:
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, FloatField
from wtforms.validators import DataRequired, Length, ValidationError, NumberRange
from .models import Crop
# FORMS RENDERED TO CORRESPONDING WEB TEMPLATES IN DEFINED VIEWS
class CropForm(FlaskForm):
crop_name = StringField("Crop Name", validators=[DataRequired(), Length(max=80)])
good_threshold = FloatField("Good", validators=[DataRequired(), NumberRange(min=-1, max=1)])
average_threshold = FloatField("Average", validators=[DataRequired(), NumberRange(min=-1, max=1)])
poor_threshold = FloatField("Poor", validators=[DataRequired(), NumberRange(min=-1, max=1)])
submit = SubmitField("Submit")
def validate_crop_name(self, crop_name): # IGNORE THIS
crop = Crop.query.filter_by(crop_name=str(crop_name.data).casefold().replace(" ", "").capitalize()).first()
if crop:
raise ValidationError("Crop with the name already exists")
def validate(self, *args, **kwargs):
super(CropForm, self).validate(*args, **kwargs)
good_input = self.good_threshold.raw_data
average_input = self.average_threshold.raw_data
poor_input = self.poor_threshold.raw_data
if good_input < average_input:
self.average_threshold.errors.append("Average cannot be more than Good Indicator")
if good_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Good indicator")
if average_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Average indicator")
当我 remove/comment CropForm FORM 中的 validate() 块时,我能够将未验证的值(如 Good=0.5、Average=0.8、Poor=0.9)发送到数据库,这就是我我不喜欢,因为它们不是降序排列
当我保持原样时 is/uncomment,CropForm FORM 中的 validate() 块,发送可接受的值,如 Good=0.9、Average=0.8、Poor=0.5,然后我点击模板上的提交按钮,它根本不发送值 t db
型号:
class Crop(db.Model):
id = db.Column(db.Integer, primary_key=True, unique=True, nullable=False)
crop_name = db.Column(db.String, unique=True, nullable=False)
good_threshold = db.Column(db.Float)
average_threshold = db.Column(db.Float)
poor_threshold = db.Column(db.Float)
def __repr__(self):
return f"{self.id}.{self.crop_name}"
查看:
@app.route("/crops", methods=["POST", "GET"])
def crops():
form = CropForm()
if form.validate_on_submit():
crop_info = Crop(crop_name=str(form.crop_name.data).casefold().replace(" ", "").capitalize(),
good_threshold=form.good_threshold.data,
average_threshold = form.average_threshold.data,
poor_threshold=form.poor_threshold.data)
db.session.add(crop_info)
db.session.commit()
flash(f"Thresholds added, check record #{crop_info.id}", 'success')
return redirect(url_for('crops'))
records = Crop.query.order_by(Crop.id)
return render_template('crop_thresholds.html', title="Crop Thresholds", form=form, records=records)
您可以尝试将您的验证函数替换为这样的东西
def validate(self, *args, **kwargs):
super(CropForm, self).validate(*args, **kwargs)
good_input = self.good_threshold.raw_data
average_input = self.average_threshold.raw_data
poor_input = self.poor_threshold.raw_data
all_okay = True
if good_input < average_input:
self.average_threshold.errors.append("Average cannot be more than Good Indicator")
all_okay = False
if good_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Good indicator")
all_okay = False
if average_input < poor_input:
self.poor_threshold.errors.append("Poor cannot be more Average indicator")
all_okay = False
return all_okay
想法是验证函数将根据返回的是 True
还是 False
来确定验证是否应该成功。因此,如果任何 if 语句失败,all_okay
将是 False
并且验证失败。否则验证应该通过并且您应该能够继续输入 if form.validate_on_submit():
代码块