在 Flask 中使用 WTForms 验证 GET 参数
Validating GET Params with WTForms in Flask
我花了几天时间试图让 WTForms 验证我的 request.args
,但我就是无法将 form.validate()
变为 return True
。
我的想法是,我有一个简单的文本字段供用户在 WTForm 中输入,如下所示。
form.py
class SearchForm(FlaskForm):
q = StringField('q',
validators=[])
search = SubmitField('Search')
def validate_q(self, q):
if q.data not in allowed_values: #"allowed_values" is just a list I want to check against
raise ValidationError('')
search.html
<form method="GET" action="{{ url_for('finance.search') }}">
<div class="col-9 col-md-5 p-0 m-0">
{% if form.q.errors %} {{ form.q(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in form.q.errors %}
<span>{{ error }}</span> {% endfor %}
</div>
{% else %} {{ form.q(class="form-control form-control-md") }} {% endif %}
</div>
<div class="col-2 col-md-2 p-0">
{{ form.search(class="btn btn-md btn-dark") }}
</div>
</form>
routes.py
@finance.route('/finance/search')
def search():
form = SearchForm(request.args)
print(form.validate()) #always gives false
表单的 HTML 代码包含在几个模板中,提交表单总是指向如下所示的搜索路径。我尝试遵循 WTForms 文档并将 request.args
传递到表单中。当我 运行 对象上的 .validate()
时, q
参数的验证函数也执行了,但由于某种原因 .validate()
总是 returns False
.
任何人都可以详细说明为什么会这样吗?我知道我可以使用 post 请求,或者在路由中添加自定义验证函数,但我想尽可能避免变通方法。
(stack-overflow 似乎使用类似类型的架构来搜索 http://127.0.0.1:8000/finance/search?q=aapl&search=Search
与 https://whosebug.com/search?q=aapl
,如果可能的话我想遵循它。)
谢谢!
实际上我只是发现错误的发生是因为我没有在表单中包含 crsf_token。不需要令牌,因为它是一个 get 请求,但这需要用 meta = {'csrf': False}
.
明确说明
@finance.route('/finance/search')
def search():
form = SearchForm(request.args, meta={'csrf': False})
print(form.validate()) #Now gives True if validation function does not raise error
我花了几天时间试图让 WTForms 验证我的 request.args
,但我就是无法将 form.validate()
变为 return True
。
我的想法是,我有一个简单的文本字段供用户在 WTForm 中输入,如下所示。
form.py
class SearchForm(FlaskForm):
q = StringField('q',
validators=[])
search = SubmitField('Search')
def validate_q(self, q):
if q.data not in allowed_values: #"allowed_values" is just a list I want to check against
raise ValidationError('')
search.html
<form method="GET" action="{{ url_for('finance.search') }}">
<div class="col-9 col-md-5 p-0 m-0">
{% if form.q.errors %} {{ form.q(class="form-control form-control-md is-invalid") }}
<div class="invalid-feedback">
{% for error in form.q.errors %}
<span>{{ error }}</span> {% endfor %}
</div>
{% else %} {{ form.q(class="form-control form-control-md") }} {% endif %}
</div>
<div class="col-2 col-md-2 p-0">
{{ form.search(class="btn btn-md btn-dark") }}
</div>
</form>
routes.py
@finance.route('/finance/search')
def search():
form = SearchForm(request.args)
print(form.validate()) #always gives false
表单的 HTML 代码包含在几个模板中,提交表单总是指向如下所示的搜索路径。我尝试遵循 WTForms 文档并将 request.args
传递到表单中。当我 运行 对象上的 .validate()
时, q
参数的验证函数也执行了,但由于某种原因 .validate()
总是 returns False
.
任何人都可以详细说明为什么会这样吗?我知道我可以使用 post 请求,或者在路由中添加自定义验证函数,但我想尽可能避免变通方法。
(stack-overflow 似乎使用类似类型的架构来搜索 http://127.0.0.1:8000/finance/search?q=aapl&search=Search
与 https://whosebug.com/search?q=aapl
,如果可能的话我想遵循它。)
谢谢!
实际上我只是发现错误的发生是因为我没有在表单中包含 crsf_token。不需要令牌,因为它是一个 get 请求,但这需要用 meta = {'csrf': False}
.
@finance.route('/finance/search')
def search():
form = SearchForm(request.args, meta={'csrf': False})
print(form.validate()) #Now gives True if validation function does not raise error