Ошибка маршрутизации в приложении поиска Python flask

#python #flask

#python #flask

Вопрос:

Я пытаюсь запустить простую функцию поиска в своем приложении flask. У меня есть следующий код, который запускает поиск

 <form action="/search" method=post>
 <input type=text name=search value="{{ request.form.search }}"></br>
 <div class="actions"><input type=submit value="Search"></div>
</form>
  

Это связано с моим search/controllers.py сценарий, который выглядит следующим образом

 @search.route('/search/')
@search.route('/search/<query>', methods=['GET', 'POST'])
def index(query=None):
    es = current_app.config.get("es")

    q = {"query":{ "multi_match":{"fields":["name","tags","short_desc","description"],"query":query,"fuzziness":"AUTO"}}}
    matches = es.search('products', 'offerings', body=q)
    return render_template('search/results.html', services=matches['_source'])
  

К сожалению, всякий раз, когда я действительно ищу, я получаю ошибку маршрутизации:

FormDataRoutingRedirect: запрос был отправлен на этот URL (http://localhost:8080/search ) но система маршрутизации автоматически перенаправила на «http://localhost:8080/search /«. URL был определен с косой чертой в конце, поэтому Flask автоматически перенаправит на URL с косой чертой в конце, если к нему был получен доступ без нее. Убедитесь, что вы напрямую отправляете свой POST-запрос на этот URL, поскольку мы не можем перенаправлять браузеры или HTTP-клиенты с данными формы надежно или без взаимодействия с пользователем. Примечание: это исключение возникает только в режиме отладки

Я попытался изменить метод на methods=['POST'] , но это не имело никакого значения.

Ответ №1:

Используйте url_for('index') для генерации правильного URL-адреса для действия.

 <form action="{{ url_for('index') }}">
  

В настоящее время вы отправляете URL-адрес без конца / . Flask перенаправляет это на маршрут с завершением / , но данные POST не выдерживают перенаправлений во многих браузерах, поэтому Flask предупреждает вас о проблеме.

Ответ №2:

Как указано в ошибке, ваша форма публикуется в / search, но ваш обработчик настроен для /search /. Сделайте их одинаковыми.