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

本文分享了在使用Flask开发高考录取数据查询系统时,遇到的分页显示问题及解决方案。通过分析paginate方法的使用,指出翻页后查询条件丢失的问题,并介绍利用session保存查询参数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近闲来无事,用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steventian72

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值