Проверка параметров GET с помощью WTForms в Flask - PullRequest
0 голосов
/ 15 апреля 2020

Я потратил пару дней, пытаясь заставить 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('')

поиск. 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>

rout.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.

Может кто-нибудь уточнить, почему это может быть? Я знаю, что могу использовать пост-запрос или добавить собственную функцию проверки внутри маршрута, но я хочу избегать обходных путей, если это возможно.

(переполнение стека, похоже, использует подобный тип архитектуры для поиска http://127.0.0.1:8000/finance/search?q=aapl&search=Search против https://stackoverflow.com/search?q=aapl и я хочу следовать этому, если это возможно.)

Спасибо!

1 Ответ

0 голосов
/ 15 апреля 2020

На самом деле я только что понял, что ошибка произошла, потому что я не включил в форму 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
...