Flask 应用程序搜索栏
Flask app search bar
我正在尝试使用 Flask 实现搜索栏,但是当我输入 url/search 时,出现了 405 错误,Method Not Allowed。
这是我的代码片段。如有任何帮助,我们将不胜感激!
forms.py
from wtforms import StringField
from wtforms.validators import DataRequired
class SearchForm(Form):
search = StringField('search', [DataRequired()])
submit = SubmitField('Search',
render_kw={'class': 'btn btn-success btn-block'})
views.py
from flask_login import login_required
from forms import SearchForm
from models import User
@app.route('/')
def index():
if current_user.is_authenticated:
return redirect(url_for('profile'))
return render_template('index.html')
@app.route('/profile', methods=['GET', 'POST'])
@login_required
def profile():
# some code to display user profile page
@app.route('/search', methods=['POST'])
@login_required
def search():
form = SearchForm()
if not form.validate_on_submit():
return redirect(url_for('index'))
return redirect((url_for('search_results', query=form.search.data)))
@app.route('/search_results/<query>')
@login_required
def search_results(query):
results = User.query.whoosh_search(query).all()
return render_template('search_results.html', query=query, results=results)
models.py
from flask_sqlalchemy import SQLAlchemy
from flask_whooshalchemy import whoosh_index
from app import app
db = SQLAlchemy()
class User(db.model):
__searchable__ = ['name']
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
whoosh_index(app, User)
search.html
{% extends 'layouts/base.html' %}
{% set page_title = 'Search' %}
{% block body %}
<div>
{{ render_form(url_for('search'), form) }} # note: render_form is some marco from another .html file
</div>
{% endblock %}
因为当您使用 GET
方法手动加载页面时,但 search
控制器只允许 POST
。你需要改变
@app.route('/search', methods=['POST'])
到
@app.route('/search', methods=['GET', 'POST'])
更新
所以基本上最好更换 search
控制器。因为它没有使用 search.html 并且工作不正常。
@app.route('/search', methods=['GET', 'POST'])
@login_required
def search():
form = SearchForm()
if request.method == 'POST' and form.validate_on_submit():
return redirect((url_for('search_results', query=form.search.data))) # or what you want
return render_template('search.html', form=form)
同样缩进4个空格,如PEP-8
中所说
我正在尝试使用 Flask 实现搜索栏,但是当我输入 url/search 时,出现了 405 错误,Method Not Allowed。
这是我的代码片段。如有任何帮助,我们将不胜感激!
forms.py
from wtforms import StringField
from wtforms.validators import DataRequired
class SearchForm(Form):
search = StringField('search', [DataRequired()])
submit = SubmitField('Search',
render_kw={'class': 'btn btn-success btn-block'})
views.py
from flask_login import login_required
from forms import SearchForm
from models import User
@app.route('/')
def index():
if current_user.is_authenticated:
return redirect(url_for('profile'))
return render_template('index.html')
@app.route('/profile', methods=['GET', 'POST'])
@login_required
def profile():
# some code to display user profile page
@app.route('/search', methods=['POST'])
@login_required
def search():
form = SearchForm()
if not form.validate_on_submit():
return redirect(url_for('index'))
return redirect((url_for('search_results', query=form.search.data)))
@app.route('/search_results/<query>')
@login_required
def search_results(query):
results = User.query.whoosh_search(query).all()
return render_template('search_results.html', query=query, results=results)
models.py
from flask_sqlalchemy import SQLAlchemy
from flask_whooshalchemy import whoosh_index
from app import app
db = SQLAlchemy()
class User(db.model):
__searchable__ = ['name']
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
whoosh_index(app, User)
search.html
{% extends 'layouts/base.html' %}
{% set page_title = 'Search' %}
{% block body %}
<div>
{{ render_form(url_for('search'), form) }} # note: render_form is some marco from another .html file
</div>
{% endblock %}
因为当您使用 GET
方法手动加载页面时,但 search
控制器只允许 POST
。你需要改变
@app.route('/search', methods=['POST'])
到
@app.route('/search', methods=['GET', 'POST'])
更新
所以基本上最好更换 search
控制器。因为它没有使用 search.html 并且工作不正常。
@app.route('/search', methods=['GET', 'POST'])
@login_required
def search():
form = SearchForm()
if request.method == 'POST' and form.validate_on_submit():
return redirect((url_for('search_results', query=form.search.data))) # or what you want
return render_template('search.html', form=form)
同样缩进4个空格,如PEP-8
中所说