在 Flask 中使用 WTForms 验证 GET 参数

sar*_*tur 3 html python flask wtforms flask-wtforms

我花了几天时间试图让 WTForms 来验证我的request.args,但我就是无法form.validate()返回True

我的想法是,我有一个简单的文本字段,用于 WTForm 中的用户输入,如下所示。

表格.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('')
Run Code Online (Sandbox Code Playgroud)

搜索.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>
Run Code Online (Sandbox Code Playgroud)

路线.py

@finance.route('/finance/search')
def search():
    form = SearchForm(request.args)
    print(form.validate()) #always gives false
Run Code Online (Sandbox Code Playgroud)

表单的 HTML 代码包含在多个模板中,提交表单始终会定向到如下所示的搜索路径。我尝试遵循 WTForms 文档并传入request.args表单。当我在对象上运行 时.validate(),参数的验证函数q也执行了,但由于某种原因.validate()总是返回False

任何人都可以详细说明为什么会这样吗?我知道我可以使用发布请求,或者在路由内添加自定义验证函数,但我想尽可能避免使用解决方法。

(堆栈溢出似乎使用类似类型的架构进行搜索,http://127.0.0.1:8000/finance/search?q=aapl&search=Search如果https://stackoverflow.com/search?q=aapl可能的话,我想遵循这一点。)

谢谢!

sar*_*tur 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
Run Code Online (Sandbox Code Playgroud)