验证 WTF 烧瓶表单输入值



我的烧瓶应用程序中有以下表格。我想确保输入值实际上是一个整数,并且如果在此处的标记 k>中输入的值可以是某个数字,它会向屏幕吐出错误消息。IntegerField 似乎没有强制执行整数值,例如,如果用户输入 2.3,它会将其传递给我的函数,该函数失败,因为它需要一个整数。

这种类型的错误消息是否可以在表单中发生,或者一旦值从表单传递到服务器,我是否需要在我的烧瓶应用程序中对其进行编程?

class Form(FlaskForm):
token = IntegerField('Token Size', [DataRequired()], default = 2)          
submit = SubmitField('Submit')

编辑根据下面的评论,使用我修改后的表格和路线更新它

class Form(FlaskForm):
token = IntegerField('Token Size', validators=[DataRequired(), NumberRange(min=1, max=10, message='Something')], default = 2)
ngram_method = SelectField('Method', [DataRequired()],
choices=[('sliding', 'Sliding Window Method'),
('adjacent', 'Adjacent Text Method')]) 
rem_stop = BooleanField('Remove Stop Words', render_kw={'checked': True})
rem_punc = BooleanField('Remove Punctuation', default = True)
text2use = SelectField('Text To Use for Word Tree', [DataRequired()],
choices=[('clean', 'Clean/Processed Text'),
('original', 'Original Text String')])
pivot_word = TextField('Pivot Word for Word Tree', [DataRequired()])                
submit = SubmitField('Submit')

以及使用该表单的路线

@word_analyzer.route('/text', methods=('GET', 'POST'))
def text_analysis():
form = Form()
result = '<table></table>' 
ngrams = '<table></table>' 
orig_text = '<table></table>' 
text = ""
if request.method == 'POST':
tmp_filename = tempfile.gettempdir()+'\input.txt'
if request.files:
txt_upload = request.files.get('text_file')
if txt_upload:
f = request.files['text_file']
f.save(tmp_filename)
if os.path.exists(tmp_filename):
file = open(tmp_filename, 'r', encoding="utf8") 
theText = [line.rstrip('n') for line in file]
theText = str(theText)
token_size = form.token.data
stops = form.rem_stop.data
punc = form.rem_punc.data
ngram_method = form.ngram_method.data
text_result = text_analyzer(theText, token_size = token_size, remove_stop = stops, remove_punctuation = punc, method = ngram_method)
result = pd.DataFrame.from_dict(text_result, orient='index', columns = ['Results'])[:-3].to_html(classes='table table-striped table-hover', header = "true", justify = "center")
ngrams = pd.DataFrame.from_dict(text_result['ngrams'], orient='index', columns = ['Frequency']).to_html(classes='table table-striped table-hover', header = "true", justify = "center")
if form.pivot_word.data == None:
top_word = json.dumps(text_result['Top Word'])
else:
top_word = json.dumps(form.pivot_word.data)
if form.text2use.data == 'original':
text = json.dumps(text_result['original_text'])
else:
text = json.dumps(text_result['clean_text'])
if form.validate_on_submit():   
return render_template('text.html', results = [result], ngrams = [ngrams], form = form, text=text, top_word = top_word) 
return render_template('text.html', form = form, results = [result],ngrams = [ngrams], text=text, top_word='') 

使用wtforms.validators.NumberRange中的NumberRange验证器。您可以传递可选的最小值和最大值以及错误消息。更多信息在这里

更新

# Form Class
class Form(FlaskForm):
token = FloatField('Token Size', validators=[DataRequired(), NumberRange(min=1, max=10, message='Something')])
# Route
if form.validate_on_submit():
print(form.name.data)

这是一个应该有效的示例,请确保您的表单类字段看起来相似,并且在您的路线中使用form.validate_on_submit():

最新更新