繁体   English   中英

Flask-WTF validate()方法是否不应覆盖其他验证?

[英]Flask-WTF validate() method shouldn't override other validations?

我正在忙于plurasight课程,该课程旨在处理Flask-wtf中的错误。 唯一的问题是课程是“过时的”。 它是在2014年制作的。在视频中,老师演示了如何在类中定义validate()方法以在我调用form.validate_on_submit()时首先使用它。 这是代码:

from flask_wtf import FlaskForm
from wtforms.fields import StringField
from wtforms.fields.html5 import URLField
from wtforms.validators import DataRequired, url


class BookmarkForm(FlaskForm):
    url = URLField('url', validators=[DataRequired(), url()])
    description = StringField('description')

    def validate(self):
        if not self.url.data.startswith("http://") or self.url.data.startswith("https://"):
            self.url.data = "http://" + self.url.data

        if not FlaskForm.validate(self):
            return False

        if not self.description.data:
            self.description.data = self.url.data

        return True

这是我的看法:

@app.route('/add', methods=['GET', 'POST'])
def add():
    form = BookmarkForm(request.form)
    if form.validate_on_submit():
        url = form.url.data
        description = form.description.data

        store_bookmark(url, description)
        flash('Stored bookmark {}'.format(description))
        return redirect(url_for('index'))
    return render_template('add.html', form=form)

问题是,Flask-wtf不允许我提交类似google.com的网址。 仅以这种形式: http : //www.google.com

根据此说明,它应像这样工作:

validate_on_submit()

仅在提交表单后才调用validate()。 这是form.is_submitted()和form.validate()的快捷方式

但事实并非如此。 仍然不允许我输入没有http://的URL。 我在文档中没有找到任何解决方案, 是一个stackoverflow问题,但是没有答案,而且它已经3年了。 请帮助我找出我做错了什么!

呈现时, wtforms.UrlField创建一个<input type="url">元素。 现代浏览器仅在URL输入元素中接受有效的绝对或相对URL 诸如“ google.com”之类的字符串不是有效的绝对或相对网址(它是主机名),因此浏览器不允许您将其键入输入。

要解决此问题,请使用StringField而不是UrlField,以便呈现<input type="text"> ,并且浏览器不执行任何验证。

class BookmarkForm(FlaskForm):
    url = StringField('url', validators=[DataRequired(), url()])
    description = StringField('description')

有关浏览器方面的一些可能解决方案,另请参阅此问题的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM