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)