Перенаправление на новую страницу с путем и необязательным аргументом в Flask и Flask-WTF не работает
Я использую Flask и Flask-WTF, и у меня есть следующий код в моем views.py
файл:
from flask import render_template, flash, redirect, url_for
from . import app, forms
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
form = forms.HelpSearch()
if form.validate_on_submit():
flash('Searched for: %s' % form.value.data)
redirect(url_for('help', form.value.data))
return render_template('index.html', title='Index', form=form)
@app.route('/help/<keyword>', methods=['GET', 'POST'])
def help(keyword=None):
form = forms.HelpSearch()
if form.validate_on_submit():
flash('Searched for: %s' % form.value.data)
redirect(url_for('help', keyword=form.value.data))
# This is just some dummy data for testing my template
keywords = ['n', 'north']
groups = ['movement']
syntax = [
{'cmd':"n", 'args': ''},
{'cmd':'north', 'args': ''}
]
content = 'Move north'
return render_template('show_help.html',
title=keyword,
form=form,
keywords=keywords,
groups=groups,
syntax=syntax,
content=content)
Что я хочу и ожидаю, так это то, что когда кто-то помещает некоторый текст в поле поиска форм и нажимает кнопку поиска, он возвращает это значение, а затем я перенаправляю на соответствующую страницу, например, он ищет foo
и в конечном итоге в / help / foo.
К сожалению, перенаправление из бита проверки формы не перенаправляет должным образом. Похоже, что он перезагружает текущую страницу.
Я точно знаю, что форма получает и возвращает данные, потому что flash
вызов отображается с правильной информацией, например, 'Searched for: foo'
но когда я передаю ключевое слово url_for
страница, опять же, просто перезагружается. Ручная навигация к /help/foo
работает отлично.
Я проверил это url_for
работает, и он создает соответствующий путь по желанию, когда я ввожу ключевое слово вручную, например, print url_for('help', keyword='foo')
печать /help/foo
,
У кого-нибудь есть идеи, почему он не перенаправляет по желанию?
Редактировать: запустил Heroku, если кто-то хочет увидеть, что именно происходит.
2 ответа
Я думаю, что ваша проблема не вернуть ничего
Вы можете проверить это:
def index():
form = forms.HelpSearch()
if form.validate_on_submit():
flash('Searched for: %s' % form.value.data)
return redirect(url_for('help', keyword=form.value.data))
return render_template('index.html', title='Index', form=form)
Проблема в том, как вы делаете свои перенаправления. Вместо этого:
redirect(url_for('help', keyword=form.value.data))
сделай это:
return redirect(url_for('help', keyword=form.value.data))
redirect()
Функция не вызывает исключение, как abort()
делает, он просто возвращает Response
объект, который должен быть передан в стек.