我花了几天的时间来尝试获取WTForms来验证我的request.args
,但是我无法让form.validate()
返回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函数,但是出于某种原因.validate()
总是返回False
。
任何人都可以详细说明为什么会这样吗?我知道我可以使用发布请求,也可以在路由内添加自定义验证功能,但如果可能的话,我想避免变通方法。
(堆栈溢出似乎在搜索http://127.0.0.1:8000/finance/search?q=aapl&search=Search
和https://stackoverflow.com/search?q=aapl
时使用了类似的架构,如果可能的话,我想遵循这种架构。)
谢谢!
答案 0 :(得分:1)
我实际上只是发现错误正在发生,因为我没有在表单中包含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