В вашем примере https://website.com/search?q=query
пространство имен url равно search
, а q
является аргументом запроса GET.Чтобы сделать это во Flask, вам нужно направить ваше представление на /search
и извлечь q
из аргументов запроса GET.WTForms позволяет вашей форме использовать метод GET или POST, в зависимости от вашего экземпляра.Это описано в документации Flask здесь .
Наконец, ваш код может выглядеть примерно так:
forms.py
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
class SearchForm(FlaskForm):
q = StringField('q', validators=[DataRequired()])
main.py
@app.route('/', methods=['GET'])
@app.route('/search', methods=['GET'])
def index():
form = SearchForm(request.args)
query = request.args.get('q', None)
table = None
if query is not None:
items = Foo.query.filter(Foo.name.like('%'+query+'%')).all()
table = ItemTable(items)
return render_template('index.html', form=form, query=query, table=table)
templates / index.html:
{% block page_content %}
<div class="page-header">
<form style="display: inline;" action="{{ url_for('index') }}" method="get" name="search">
{{ form.q(size=20) }}
<input type="submit" value="Search">
</form>
{% if table %}
<h1>Search results for "{{ query }}":</h1>
{{ table }}
{% endif %}
</div>
{% endblock page_content %}
Я также немного реорганизовал ваш код, потому что двойной вызов метода render_template для почти схожей логики кажется довольно избыточным.