【问题标题】:Validating GET Params with WTForms in Flask在 Flask 中使用 WTForms 验证 GET 参数
【发布时间】:2020-04-15 19:56:31
【问题描述】:

我花了几天时间试图让 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。

谁能详细说明为什么会这样?我知道我可以使用发布请求,或在路由中添加自定义验证功能,但我想尽可能避免使用变通方法。

(stack-overflow 似乎使用类似类型的架构来搜索 http://127.0.0.1:8000/finance/search?q=aapl&amp;search=Search 与 https://stackoverflow.com/search?q=aapl,如果可能的话,我想遵循。)

谢谢!

【问题讨论】:

    标签: python html flask flask-wtforms wtforms


    【解决方案1】:

    我实际上只是发现错误正在发生,因为我没有在表单中包含 crsf_token。由于它是一个获取请求,因此不需要令牌,但这需要使用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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2014-02-05
    • 2021-12-09
    • 2016-05-30
    • 2021-11-05
    • 2014-01-21
    • 2021-01-30
    相关资源
    最近更新 更多