在Flask中使用WTForms验证GET参数

3

我已经花了几天时间尝试让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()总是返回False。请问有谁能详细解释一下可能的原因吗?我知道我可以使用POST请求或在路由中添加自定义验证函数,但如果可能的话,我想避免这些解决方法。(似乎stack-overflow对于他们的搜索也使用了类似的架构,如http://127.0.0.1:8000/finance/search?q=aapl&search=Searchhttps://stackoverflow.com/search?q=aapl,我希望如果可能的话可以遵循这种方式。) 谢谢!
1个回答

5

我实际上刚刚发现错误是因为表单中没有包含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

我花了好几个小时寻找这个答案,简直让我发疯。感谢您的发布!!:-D - yeamusic21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接