flask后端讲解作业-2024-6-6

作业

** 图书管理系统要求**

  • 使用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 字节)