我一直试图建立一个搜索表单,以从我使用mysqldb在本地创建的数据库中读取isbn,author,year和title。 即使我仔细考虑了几个网站,尝试了一些教程来实现这一目标,也找不到最佳的方法。现在我所做的就是这个。 Python代码
@app.route('/search_results/<query>', methods = ['GET','POST'])
@is_logged_in
def search_results(query):
cur=mysql.connection.cursor()
likeString = "'%%" + query + "%%'"
result = cur.execute("SELECT * FROM books WHERE %s LIKE %s;", (query, likeString))
if result > 0:
data = cur.fetchall()
return render_template('search_results.html' , data = search)
else:
error = 'Nothing found'
return render_template('dashboard.html' , error = error)
return render_template('dashboard.html')
@app.route('/dashboard')
@is_logged_in
def dashboard():
search = SearchForm(request.form)
if request.method == 'POST':
select = form.select.data
search = form.search.data
query = select + search
return redirect((url_for('search_results', query = query)))
return render_template('dashboard.html', form = search)
和我的html代码如下:-
{% extends 'layout.html' %}
{% block body %}
<h1>Dashboard <small>Welcome {{session.username}}</small></h1>
{% from "includes/_formhelpers.html" import render_field %}
<form action="/search_results/{{form.select}}/{{form.search}}" method=post>
<dl>
{{ render_field(form.select) }}
<p>
{{ render_field(form.search) }}
</dl>
<p><input type=submit value=Search>
</form>
</div>
{% for message in get_flashed_messages() %}
<div class=flash>
{{ message }}
</div>
{% endfor %}
{% endblock %}
我还创建了一个单独的search_results.html,该文件不包含任何内容,但标题H1如下所示显示搜索
<h1>{{search}}</h1>
答案 0 :(得分:1)
我从没见过GET
和POST
路线的@Bendebaria模式,但是还没有经过测试,所以我无法确认它是否有效(尽管我怀疑它不会成功) t(如果您以这种方式定义了多个路由)。 Flask官方文档(http://flask.pocoo.org/docs/1.0/quickstart/#http-methods)表示要这样做:
from flask import request
@app.route('/search', methods=['GET', 'POST'])
def search():
if request.method == 'POST':
return do_the_db_search()
else:
return show_the_search_form()
但是,确实就像他说的那样,您不需要redirect
,实际上您可以将常规函数作为现有路由的一部分来调用,然后在其中返回render_template
。
答案 1 :(得分:0)
您不应使用redirect()
。
您可以分别使POST和GET进程,而您只需要渲染即可。像这样:
search = SearchForm(request.form)
@app.route('/dashboard')
@is_logged_in
def get():
return render_template('dashboard.html', form = self.search)
def post():
select = form.select.data
search = form.search.data
query = select + self.search
return render_template('search_results', result = result)