作业
** 图书管理系统要求**
- 使用flask框架
- 数据库交互
- 请求的接收和处理
- 模板技术
- 接口路由技术
数据库准备
mysql(命令行)
# 创建数据库
CREATE DATABASE bms charset=utf8;
# 切换数据库
USE bms;
# 查看数据库中有哪些数据表
show tables;
# 创建数据表(字段根据需求去创建)
CREATE TABLE book (
bid INT PRIMARY KEY AUTO_INCREMENT,
name CHAR(50),
price FLOAT,
summary CHAR(50),
quantity INT
);
# 插入数据
INSERT INTO books (name, price, summary, quantity)
VALUES("Python编程从入门到实践", 69.8, "python零基础入门自学教材程序设计软件开发书籍", 2),
("C++从入门到精通", 37.6, "C++零基础入门自学教材", 4),
("Java核心技术系列书籍共8册", 671.0, "开发基础高级特性(原书第12版)", 1),
("JavaScript高级程序设计", 68.4, "编程语言与程序设计类书籍 JS从入门到精通", 3);
sqlite3(命令行)
# 创建数据库
sqlite3是一个内嵌的数据库,只需要在Python里添加第三方库(pip install sqlite3),然后需要在本地生成一个存放数据库的文件
如果当前路径没有这个名字的文件,就会创建一个,并且进入命令行模式,如果有,则直接打开这个数据库,进入命令行模式
sqlite3 test.db
或者
sqlite3 db.xxxx
# 查看数据库中有哪些数据表
. tables
# 查看表的结构
.schema
# 创建数据表(字段根据需求去创建)如果是sqlite则是AUTOINCREMENT
#sqlite
CREATE TABLE book (
bid INTEGER PRIMARY KEY AUTOINCREMENT,
name CHAR(50),
price FLOAT,
summary CHAR(50),
quantity INTEGER
);
# 插入数据
INSERT INTO book (name, price, summary, quantity)
VALUES("Python编程从入门到实践", 69.8, "python零基础入门自学教材程序设计软件开发书籍", 2),
("C++从入门到精通", 37.6, "C++零基础入门自学教材", 4),
("Java核心技术系列书籍共8册", 671.0, "开发基础高级特性(原书第12版)", 1),
("JavaScript高级程序设计", 68.4, "编程语言与程序设计类书籍 JS从入门到精通", 3);
代码展示(连接mysql数据库)
from flask import Flask, render_template, request, redirect
from flask_cors import CORS
from pymysql import Connect
# 註冊flask
app = Flask(__name__)
# 解決中文編碼顯示問題
app.json.ensure_ascii = False
# 跨域
CORS(app, supports_credentials=True)
db_connect = Connect(
host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='bbookms',
charset='utf8'
)
'''
第一步:指定路由路径和请求的方法
第二步:判断请求
第三步:使用render_template进行页面发送
第四步:对于post请求,首先考虑是否需要提取请求体里的数据
第五步:创建游标,编写sql语句,然后与数据库进行交互
'''
# 編寫程序的首頁
@app.route('/', methods=['GET'])
def index_page():
return render_template('index.html')
# list:列表數據的展示
@app.route('/list', methods=['GET'])
def list():
# 要和數據庫交互,拿數據,就必須創建游標對象,來和數據庫交互
cursor = db_connect.cursor()
# 編寫sql字符串
sql_str = ''' SELECT * FROM book'''
# 使用游標執行sql語句
cursor.execute(sql_str)
# 從游標中提取抓取到的數據
result = cursor.fetchall()
# 關閉游標
cursor.close()
List_book = []
for i in result:
item = {}
item['bid'] = i[0]
item['name'] = i[1]
item['price'] = i[2]
item['summary'] = i[3]
item['quantity'] = i[4]
List_book.append(item)
return List_book
# 添加書本接口
# 第一步:指定路由和請求方法
@app.route('/add', methods=['GET', 'POST'])
def add():
# 第二步:區分請求類型是get還是post
if request.method == 'GET':
return render_template('add.html')
else:
# 添加接口,需要獲取請求體裡面的數據
json_data = request.form
# 接收請求體裡的書本名字,價格,概要,數量
name = json_data.get('name')
price = json_data.get('price')
summary = json_data.get('summary')
quantity = json_data.get('quantity')
# 跟數據庫交互,就要依靠游標
cursor = db_connect.cursor()
sql_str = '''INSERT INTO book(name,price,summary,quantity) values(%s,%s,%s,%s)'''
cursor.execute(sql_str, [name, price, summary, quantity])
# 需要對數據庫產生影響,所以必须commit
db_connect.commit()
cursor.close()
return redirect('/list')
# 修改接口
# 第一步:先指定路由路径
@app.route('/update/<int:bid>', methods=['GET', 'POST'])
def update(bid):
if request.method == 'GET':
return render_template('update.html')
else:
# 需要从请求里拿到书本的更新信息:name,price,summary,quantity
json_data = request.form
name = json_data.get('name')
price = json_data.get('price')
summary = json_data.get('summary')
quantity = json_data.get('quantity')
cursor = db_connect.cursor()
sql_str = f'''UPDATE book SET name=%s,price=%s,summary=%s,quantity=%s where bid={bid}'''
cursor.execute(sql_str, [name, price, summary, quantity])
db_connect.commit()
cursor.close()
return redirect('/list')
@app.route('/delete/<int:bid>', methods=['GET'])
def delete(bid):
cursor = db_connect.cursor()
sql_str = f''' DELETE FROM book WHERE bid={bid}'''
cursor.execute(sql_str)
db_connect.commit()
cursor.close()
return redirect('/list')
@app.route('/search', methods=['GET'])
def search():
# 搜索功能,需要拿到请求里的查询参数
key = request.args.get('key')
cursor = db_connect.cursor()
sql_str = ''' SELECT * FROM book WHERE name LIKE %s OR summary LIKE %s'''
cursor.execute(sql_str, ['%' + key + '%', '%' + key + '%'])
result = cursor.fetchall()
List_book = []
for i in result:
item = {}
item['bid'] = i[0]
item['name'] = i[1]
item['price'] = i[2]
item['summary'] = i[3]
item['quantity'] = i[4]
List_book.append(item)
return List_book
if __name__ == '__main__':
app.run(port=8888, host='0.0.0.0', debug=True)
代码展示(连接sqlite3数据库)
from flask import Flask, g, request, render_template, redirect
from flask_cors import CORS
app = Flask(__name__)
app.json.ensure_ascii=False
import sqlite3
# db = sqlite3.connect('db.sqlite3')
CORS(app,supports_credentials=True)
# 连接到数据库的函数
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect('db.sqlite3')
return db
# 关闭数据库连接的函数
@app.teardown_appcontext
def close_connection(exception):
db = getattr(g, '_database', None)
if db is not None:
db.close()
@app.route('/',methods=['GET'])
def index_page():
return render_template('index.html')
@app.route('/list',methods=['GET'])
def list():
db = get_db()
cursor = db.cursor()
sql_str='''select * from book'''
cursor.execute(sql_str)
result = cursor.fetchall()
List_book=[]
for i in result:
item={}
item['bid']=i[0]
item['name'] = i[1]
item['price'] = i[2]
item['summary'] = i[3]
item['quantity'] = i[4]
List_book.append(item)
cursor.close()
return List_book
@app.route('/add',methods=['GET','POST'])
def add():
if request.method=='GET':
return render_template('add.html')
else:
json_data = request.form
name=json_data.get('name')
price = json_data.get('price')
summary = json_data.get('summary')
quantity = json_data.get('quantity')
db=get_db()
cursor = db.cursor()
sql_str='''INSERT INTO book(name,price,summary,quantity) values(?,?,?,?)'''
cursor.execute(sql_str,[name,price,summary,quantity])
db.commit()
cursor.close()
return redirect('/list')
@app.route('/update/<int:bid>',methods=['GET','POST'])
def update(bid):
if request.method=='GET':
return render_template('update.html')
else:
json_data = request.form
name = json_data.get('name')
price = json_data.get('price')
summary = json_data.get('summary')
quantity = json_data.get('quantity')
db=get_db()
cursor = db.cursor()
sql_str =f'''UPDATE book SET name=?,price=?,summary=?,quantity=? WHERE bid={bid}'''
cursor.execute(sql_str,[name,price,summary,quantity])
db.commit()
cursor.close()
return redirect('/list')
@app.route('/delete/<int:bid>',methods=['GET'])
def delete(bid):
db=get_db()
cursor=db.cursor()
sql_str=f'''DELETE FROM book WHERE bid={bid}'''
cursor.execute(sql_str)
db.commit()
cursor.close()
return redirect('/list')
@app.route('/search',methods=['GET'])
def search():
key=request.args.get('key')
db=get_db()
cursor=db.cursor()
sql_str='''SELECT * FROM book WHERE name LIKE ? OR summary LIKE ?'''
cursor.execute(sql_str,['%'+key+'%','%'+key+'%'])
result = cursor.fetchall()
List_book=[]
for i in result:
item = {}
item['bid'] = i[0]
item['name'] = i[1]
item['price'] = i[2]
item['summary'] = i[3]
item['quantity'] = i[4]
List_book.append(item)
return List_book
if __name__ == '__main__':
app.run(host='0.0.0.0',port=8888,debug=True)
两种数据库的差异点
- sqlit3数据库是不支持使用
%s
作为占位符的,它是使用?
作为占位符。 - 在创建table表格时,
sqlite
数据库的自增属性和整形属性的写法和mysql有些许差别。
postman请求collection数据包
backend_flask.postman_collection.zip (928 字节)