最近闲来无事,用Flask开发一个高考录取数据查询系统。
-
开发环境:
Flask + SQLite数据库
-
需求:
在网页上输入需要查询的高校名称(模糊查询)或者分数或者年份,查询高校录取结果(分数线)
-
数据库定义:
三张表,录取分数、录取批次、一分一段表
-
人机界面定义:
在网页上输入学校名称、分数、年份,提交后输出符合条件的学校录取信息。
开发过程很顺利,毕竟没有任何难度。
人总是不满足的。基本功能实现后,发现个问题,如果查询结果很多,会形成一个常常的列表,不好看。
flask的SQLAlcademy提供paginate方法能实现分页显示查询结果。加入paginate代码后,问题来了,第一页显示没问题,翻页后,显示结果没有了,显示空白网页。
问题所在,看下面的路由代码:
@app.route('/science', methods=['GET', 'POST'])
def science():
html_url = 'science.html'
form = QueryForm()
if form.validate_on_submit():
table_return = base_query_admission(html_url, form, tbl_admission).paginate(page,per_page=12,error_out=False)
if table_return:
return render_template(html_url, form=form, tbl_admissions=table_return,pagination=pagination)
else:
return render_template(html_url, form=form )
return render_template(html_url, form=form )
每次Form提交数据后才执行查询,而翻页操作却并不能激活form.validate_on_submit这个条件,而paginate每次刷新翻页时都重新执行查询,所以,翻页后查询条件没有了,数据“不见了”。
- 解决思路:
首先想到的是换个新网页显示查询结果,通过“传统的”GET方式将学校、分数、年份查询条件传给新网页,但依旧存在翻页后变空白的问题,原因依旧是翻页后查询条件无法保留。
因此,解决问题的关键集中在如何在网页之间传递查询参数,且能“保留住”这个参数。
总结一:Flask WTF在网页间(路由函数)传递参数方法
一、静态模板(URL)传参数
参数数据类型可以指定也可以不指定。
首先是不指定数据类型的例子
@app.route('/<id>/')
def index(id):
id = int(id) ** 5
id = str(id)
return id
然后是指定数据类型的例子
@app.route('/<int:id>/')
def index(id):
id = id ** 5
id = str(id)
return render_template("index.htm", id=id)
模板的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>静态模板传值方法</title>
</head>
<body>
{{ id }}
</body>
</html>
运行结果:网页上显示 32
二、请求传参
对这样的URL请求:http://localhost:5000/tk?p=1&type=1,可使用请求(request)传参
@app.route('/tk', methods=['post','get'])
def tk():
p = request.args.get('p')
type = request.args.get('type')
# 下面代码略
三、session传参
session传参也是我遇到的问题的最终解决办法。提交Form数据时,设置需要通过session传递的参数,在分页显示时,从session处获取参数。
先看设置session参数的代码:
@app.route('/science', methods=['GET', 'POST'])
def science():
html_url = 'science.html'
form = QueryForm()
page=request.args.get('page',1,type=int)
if form.validate_on_submit():
session['science_schoolname'] = form.schoolname.data
session['science_maxscore'] = form.maxscore.data
session['science_minscore'] = form.minscore.data
session['science_year'] = form.year.data
然后是获取参数的代码:
def base_query_admission(table, science):
if science == 0:
schoolname = session.get('science_schoolname')
maxscore = session.get('science_maxscore')
minscore = session.get('science_minscore')
year = session.get('science_year')
#以下代码略
四、Cookies传参
from flask import Flask, request
from flask import make_response
app = Flask(__name__)
#获取cookie
@app.route('/get_cookie')
def get_cookie():
name = request.cookies.get('passwd')
return name
#删除cookie
@app.route('/del_cookie')
def del_cookie():
resp = make_response('delete_cookie')
resp.delete_cookie('passwd')
return resp
#设置cookie
@app.route('/set_cookie')
def set_cookie():
resp = make_response('set_cookie')
resp.set_cookie('passwd', '123456')
return resp