【问题标题】:Validate WTF Flask Form Input Values验证 WTF Flask 表单输入值
【发布时间】:2020-05-20 18:51:35
【问题描述】:

我的烧瓶应用程序中有以下表格。我想确保输入值实际上是一个整数,并且如果在 token > k 这里输入的值 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='') 

【问题讨论】:

    标签: python-3.x flask flask-wtforms


    【解决方案1】:

    使用来自wtforms.validators.NumberRangeNumberRange 验证器。您可以将可选的最小值和最大值与错误消息一起传递。更多信息here

    更新

    # 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():

    【讨论】:

    • 谢谢,由于某种原因,此代码 token = IntegerField('Token Size', validators=[DataRequired(), NumberRange(min=1, max=10, message='Something')], default = 2)' yields an error that NameError: name 'NumberRange' is not defined`?
    • Arg,我没有导入 NumberRange。是这样吗,但奇怪的是,现在使用这段代码,似乎 NumberRange 被忽略了?当我故意超出边界时,代码仍然运行
    • 我已经更新了答案,看看。如果它不起作用,请使用路线的代码实现更新您的问题。
    • 谢谢。用实际形式和路线更新了原始问题。理想情况下,如果值 token 超出最小/最大边界,则会在屏幕上的某处以有意义的方式打印一条错误消息,以便用户知道需要进行哪些更正。
    • 您正在处理表单数据而不验证它,如代码 sn-p 所示,您应该检查 form.validate_on_submit() 是否返回 True。这是检查验证器的地方。如果form.validate_on_submit()返回False,则使用form.errors返回错误信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多