网页跳转操作以及提交post表单 2019.7.8

本文介绍了如何在网页中使用POST方式提交表单,强调了在Python中处理POST请求的方法和SQL语句书写时的注意事项,包括空格的重要性、参数化和元组元素数量的管理。同时,讨论了模糊查询和GET请求的区别。

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

post访问方式

一般情况下,网页的直接访问方式只有get形式,如果想要提交post表单,需要在修饰器中声明methods有post方式,才可以提交post表单;即:

@app.route("/lib",methods=['GET','POST'])

如果需要使用post请求来跳转页面就加上if语句,在访问方式变为post时进行一个跳转的变换:

if request.method == 'POST':

还可以使用request函数来获取请求的内容和请求的数据,两个语句分别为:

#其中f是指定的复选框的名称
request.form['f']
#get是获取数据,key是指定文本输入框的名字
 request.form.get('key')

sql语句书写方式

空格空格一定要注意空格!

sql语句中或其他语句中都要注意空格的存在,所有在进行sql语句拼接时,要注意在where前后加上空格,其他的条件也是这样,比如name或id等都要注意前后有空格;

参数化

sql语句可以参数化,使用%即可,在语句中加入%s,在引号外可以加上%s来代替缺失的语句,或者在调用sql语句来访问数据库时加上参数:

sql3 = sql + " where " + request.form['f'] + " = '%s'" % request.form.get('key')
sql4 = "select count(*) from imd_copybook where book_id = %s"
cursor.execute(sql4,two[5])
sql5 = "select count(*) from imd_copybook where is_borrow=1 and status=1 and book_id= %s"
cursor.execute(sql5, two[5])	

注意最后导出的元组中元素的数量

其实先找一个列表来存放数据,最后把整个列表导入另外一个列表中,只会有一个数据,所以最后在新的页面中就算是循环,也只会有一个表格,而不是出现多个表格,注意这一点,如果是分批次导入数据,那么会出现很多个表格,并且有的表格会缺失数据;
最后是完整的代码:
py:

from flask import Flask, render_template,request
import pymysql
app = Flask(__name__)
#路由默认只支持get,如果需要增加,需要自行指定
@app.route("/lib",methods=['GET','POST'])
def index():
    # 连接数据库的四个要素(端口号默认3306,已省略)
    hostName = "localhost"
    userName = "root"
    userPassword = "root"
    dbName = "study11"
    # 使用connect方法进行连接MySQL
    # 函数
    db = pymysql.connect(hostName, userName, userPassword, dbName)
    # 我们需要一个游标
    cursor = db.cursor()
    # 编写SQL
    sql = "select * from imd_book"
    # sql = """insert into imd_book (isdn,publish_date,author,publisher,name,bookid)
    # values ('188XXX188','2007/2/3','施耐庵','中国出版社','水浒传',21)"""
    #sql = "delete from imd_book where bookid=17"
    #馆藏副本总数
    sql1 = "select count(*) from imd_copybook where book_id = %s"
    #馆藏可借总数  is_borrow=1可借 stautus=1未被借走
    sql2 = "select count(*) from imd_copybook where is_borrow=1 and status=1 and book_id= %s"
    try:
        # 执行SQL,使用execute方法执行
        cursor.execute(sql)
        # 获取数据
        results = cursor.fetchall()
        #print(results)
        # 循环显示数据
        datalist = []
        for row in results:
            #每一次循环都把one列表变成空列表
            one = []
            #把第一本书的所有数据放在one这个列表中
            one.append(row[0])
            one.append(row[1])
            one.append(row[2])
            one.append(row[3])
            one.append(row[4])
            one.append(row[5])
            #通过sql1和书的id去imd_copybook表中查询书的总数量
            cursor.execute(sql1, [row[5]])
            #把该id的书的所有馆藏副本数量赋给results1
            results1 = cursor.fetchone()
            print (results1)
            #再把这个数据加入到one这个列表中
            one.append(results1[0])
            print (one)
            #执行sql2,获取可以借阅到的副本数量
            cursor.execute(sql2,[row[5]])
            #把该值赋给results2
            results2 = cursor.fetchone()
            #再加入到one列表中
            one.append(results2[0])
            #把整个one列表加入到datalist空列表中
            datalist.append(one)
    except:
        print("error")
    if request.method == 'POST':
        # 获取想要的参数
        #print (request.form['f'])
        #print (name_key)
        sql3 = sql + " where " + request.form['f'] + " = '%s'" % request.form.get('key')
        #print (sql3)
        sql4 = "select count(*) from imd_copybook where book_id = %s"
        sql5 = "select count(*) from imd_copybook where is_borrow=1 and status=1 and book_id= %s"
        datalist_two = []
        try:
            #查询书本信息
            cursor.execute(sql3)
            results3 = cursor.fetchall()
            print (results3[0])
            two = []
            for row_one in results3[0]:
                two.append(row_one)
            print(two)
            #查询馆藏数量
            cursor.execute(sql4,two[5])
            results4 = cursor.fetchone()
            #print(results4)
            #查询可借数量
            cursor.execute(sql5, two[5])
            results5 = cursor.fetchone()
            #print(results5)
            two.append(results4[0])
            two.append(results5[0])
            #数据导入列表
            datalist_two.append(two)
            #print (datalist_two)
        except:
            print("error")
        return render_template('lib.html', datalist=datalist_two)
    # 关闭游标
    cursor.close()
    # 关闭数据库
    db.close()
    return render_template('lib.html',datalist = datalist)

# @app.route("/1")
# def index_1():
#     return render_template('1.html')
# @app.route("/2")
# def index_2():
#     return render_template('2.html')
if __name__ == '__main__':
    app.run(host="0.0.0.0")

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学习学习</title>
    <link href="{{url_for('static',filename='ico.ico')}}" rel="icon" type="image/x-icon"/>
</head>
<body>
	<h1 align="center">书目检索系统</h1>
	<form method="post" action="{{url_for('index')}}" target="_blank">
	<table align="center">
	<tr>
		<td><select name="f">
			<option value="name" selected="selected">书名</option>
			<option value="author">作者</option>
		</select></td>
		<td><input type="text" name="key"></td>
		<td><input value="查询" type="submit"></td>
	</tr>
	</table align = "center">
	<table border="1" align=center>
		{% for r in datalist %}
		<tr>
			<td colspan="2" align = "center">书名:{{r[4]}}</td>
		</tr>
		<tr>
			<td align="center" width="200px">作者</td>
			<td align="center" width="200px">{{r[2]}}</td>
		</tr>
		<tr>
			<td align="center" width="200px">出版社</td>
			<td align="center" width="200px">{{r[3]}}</td>
		</tr>
		<tr>
			<td align="center" width="200px">出版日期</td>
			<td align="center" width="200px">{{r[1]}}</td>
		</tr>
		<tr>
			<td colspan="2" ><ul>
				<li>馆藏副本:{{r[6]}}</li>
				<li>可借副本:{{r[7]}}</li>
			</ul></td>
		</tr>
<!--		<tr>-->
<!--			<td colspan="3">2、第二本书的书名</td>-->
<!--		</tr>-->
<!--		<tr>-->
<!--			<td><img width="60" src={{url_for('static',filename='book/2.jpg')}}></td>-->
<!--			<td><ul>-->
<!--				<li>第二本书作者</li>-->
<!--				<li>第二本书出版社</li>-->
<!--			</ul></td>-->
<!--			<td><ul>-->
<!--				<li>馆藏副本:4</li>-->
<!--				<li>可借复本:1</li>-->
<!--			</ul></td>-->
<!--		</tr>-->
		{% endfor %}
		</table>
		</form>
<!--    	<img width="100" src="{{url_for('static',filename='pic.jpg')}}" title="这是想做成ioc的图片"> <br>-->
<!--	这是一个图片。-->
</body>
</html>

可以模糊查询,使用like

代码可以修改为:

sql3 = sql + " where " + request.form['f'] + " like '%{}%'"
sql3 = sql3.format(request.form.get('key'))

request中使不使用get的区别

request.form.get('key')
request.form['key']

sql.format

sql3 = sql + " where " + request.form['f'] + " like '%{}%'"
#里面的花括号内的内容其实就是使用format来展现的内容,用花括号来做一个预存在内容的体现,而%号其实就是代表字符,借助like实现模糊查询
sql3 = sql3.format(request.form.get('key'))

#也比如说下面的句子
sql = "delete from imd_book where bookid = {}"
sql = sql.format(id)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值