Перенаправление на новую страницу с путем и необязательным аргументом в 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 объект, который должен быть передан в стек.

Другие вопросы по тегам