Flask-WTF validate() 方法不应该覆盖其他验证?
Flask-WTF validate() method shouldn't override other validations?
我正忙于 plurasight 课程,我想在其中处理 Flask-wtf 中的错误。唯一的问题是课程“有点过时”。它是2014年制作的。在视频中,老师展示了如何在class中定义一个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 这样的 url。只有这种形式:http://www.google.com。
基于this description
它应该像这样工作:
validate_on_submit()
仅在提交表单时调用 validate()。这是 form.is_submitted() 和 form.validate()
的快捷方式
但事实并非如此。它仍然不允许我在没有 http:// 的情况下输入 URL。
我没有在文档中找到任何解决方案,here 是一个 Whosebug 问题,但没有答案,它也有 3 年历史了。请帮我找出我做错了什么!
渲染时,wtforms.UrlField
会创建一个 <input type="url">
元素。现代浏览器只接受 url 输入元素中的 valid absolute or relative urls。像 'google.com' 这样的字符串不是有效的绝对值或相对值 url(它是主机名),因此浏览器不会让您在输入中输入它。
要解决此问题,请使用 StringField 而不是 UrlField,以便呈现 <input type="text">
,并且浏览器不会执行任何验证。
class BookmarkForm(FlaskForm):
url = StringField('url', validators=[DataRequired(), url()])
description = StringField('description')
另请参阅 this question 的答案,了解浏览器端的一些可能解决方案。
我正忙于 plurasight 课程,我想在其中处理 Flask-wtf 中的错误。唯一的问题是课程“有点过时”。它是2014年制作的。在视频中,老师展示了如何在class中定义一个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 这样的 url。只有这种形式:http://www.google.com。
基于this description 它应该像这样工作:
validate_on_submit()
仅在提交表单时调用 validate()。这是 form.is_submitted() 和 form.validate()
的快捷方式但事实并非如此。它仍然不允许我在没有 http:// 的情况下输入 URL。 我没有在文档中找到任何解决方案,here 是一个 Whosebug 问题,但没有答案,它也有 3 年历史了。请帮我找出我做错了什么!
渲染时,wtforms.UrlField
会创建一个 <input type="url">
元素。现代浏览器只接受 url 输入元素中的 valid absolute or relative urls。像 'google.com' 这样的字符串不是有效的绝对值或相对值 url(它是主机名),因此浏览器不会让您在输入中输入它。
要解决此问题,请使用 StringField 而不是 UrlField,以便呈现 <input type="text">
,并且浏览器不会执行任何验证。
class BookmarkForm(FlaskForm):
url = StringField('url', validators=[DataRequired(), url()])
description = StringField('description')
另请参阅 this question 的答案,了解浏览器端的一些可能解决方案。