Frasco: use la misma vista para representar un formulario de búsqueda y luego los resultados de búsqueda

Quiero tener un formulario de búsqueda para consultar la base de datos y mostrar los resultados de la búsqueda que se encuentra debajo. No quiero que aparezca ninguna advertencia de confirmación al actualizar la página. También quiero saber si esto se puede hacer con una sola función de vista, ya que todos los tutoriales que he visto usan más de uno. Como este y este .

Esto está funcionando pero muestra una advertencia que solicita confirmación al hacer clic en el botón de actualización en el navegador:

main.py

@app.route('/', methods=['GET', 'POST']) @app.route('/index', methods=['GET', 'POST']) def index(): form = SearchForm() query = form.data['search'] if query != '': results = Foo.query.filter(Foo.name.like('%'+query+'%')).all() return render_template('index.html', form=form, query=query, results=results) return render_template('index.html', form=form) 

forms.py

 from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired class SearchForm(FlaskForm): search = StringField('search', validators=[DataRequired()]) 

templates / index.html

 {% block page_content %}  {% endblock page_content %} 

Esto es lo que me gustaría, pero da a una page not redirecting properly error un page not redirecting properly error :

  @app.route('/', methods=['GET', 'POST']) def index(): form = SearchForm(request.form) if form.validate: session['query'] = form.data['search'] return redirect(url_for('index')) if 'query' in session: results = Foo.query.filter(Foo.name.like('%'+session.get('query')+'%')).all() return render_template('index.html', form=form, query=session.get('query'), results=results) else: return render_template('index.html', form=form) 

Puede tener una sola función para representar la página de búsqueda y luego, después de form.validate_on_submit() consulte la base de datos y devuelva los resultados. Para los resultados de búsqueda, agregue una statement if para mostrarlos en la misma plantilla que el formulario de búsqueda.

 @app.route('/search', methods=['GET', 'POST']) def search(): form = SearchForm() if form.validate_on_submit(): search_term = form.query.data results = Foo.query.all() return render_template('search.html', form=form, results=results) return render_template('search.html', form=form) 

search.html

 {% block content%} 
{{ form.csrf_token }} {{ form.query }} {{ form.submit }} {% if results %} {{ results }} {% endif %}
{% endblock %}