#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 /. Сделайте их одинаковыми.