Flask 路由参数传递 & SQLAlcademy paginate应用开发笔记

mac2024-03-25  34

最近闲来无事,用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
最新回复(0)