用Python flask框架写的简单版图书管理系统

用Python flask框架写的简单版图书管理系统

文章目录

      • 用Python flask框架写的简单版图书管理系统
          • 1.代码部分
          • 2.前端采用的模板渲染方式做的简单界面

1.代码部分
  • 连接数据库
  • 用ORM用原生代码创建SQL表
  • 从前端拿到数据
  • 对数据库的数据做增删改查
from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy

# 1.创建web应用
app = Flask(__name__)
# 设置连接数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/books24'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# app.config['SQLALCHEMY_ECHO'] = True

# 有状态保持就要设置迷药
app.secret_key = "test"

# 创建连接对象
db = SQLAlchemy(app)


# 作者表 一
class Author(db.Model):
    __tablename__ = "t_author"
    id = db.Column(db.Integer, primary_key=True)  # 主键
    name = db.Column(db.String(40), unique=True)
    # 与作者表有关系属性
    books = db.relationship("Book")


# 书籍表 多
class Book(db.Model):
    __tablename__ = "t_book"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40), unique=True)
    # 在多的一方创建外键
    author_id = db.Column(db.Integer, db.ForeignKey('t_author.id'))


# 3. 定义路由  让视图函数和URL进行绑定  访问URL时, 调用对应的视图函数
@app.route("/", methods=["GET", "POST"])
def index():
    if request.method == "GET":  # 展示页面
        # 查询作者
        authors = Author.query.all()
        # 返回页面
        return render_template("book_test1.html", authors=authors)
    # POST获取数据
    author_name = request.form.get("author_name")
    book_name = request.form.get("book_name")

    # 参数校验  all()  只有当列表中的元素都有(不是None/0/空字符)值的时候才会返回True
    if not all([author_name, book_name]):
        flash("参数错误")
        redirect(url_for("index"))

    try:  # 一旦对数据库做增删改就要做异常处理
        # 判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()

        # 如果存在
        if author:  # 有作者添加书籍
            book = Book(name=book_name)
            # 关联作者表
            author.books.append(book)
            # 添加到会话
            db.session.add(book)
            # 提交事物
            db.session.commit()
        else:  # 作者书籍同时添加
            # 添加作者信息
            author = Author(name=author_name)
            # 添加书籍
            book = Book(name=book_name)
            # 建立关联关系
            author.books.append(book)
            # 添加会话
            db.session.add_all([author, book])  # add_all添加多的
            # 事物提交
            db.session.commit()
    except Exception as e:
        # 如果前段传来的数据异常 提示
        flash("参数异常")
        # 增删改操作失败,必须进行回滚
        db.session.rollback()
        return redirect(url_for("index"))
    # 返回主页
    return redirect(url_for("index"))


@app.route('/delete_book')
def delete_book():
    # 得到页面数据
    bookid = request.args.get("bookid")
    # print(bookid)
    try:
        # 判断是否是int类型,不是提示
        bookid = int(bookid)

        # 根据bookid从数据库查询数据
        book = Book.query.get(bookid)

        # 删除书籍
        db.session.delete(book)

        # 提交事物
        db.session.commit()
    except Exception as e:
        flash("参数错误")
        # 回滚
        db.session.rollback()
        return redirect(url_for("index"))
    # 删除成功返回主页
    return redirect(url_for("index"))


# 删除作者,用动态idv ,同时删书籍,删除一对多,线删除多的乙方
@app.route('/delete_author/')
def delete_author(authorid):
    try:
        # 从数据库查询数据
        author = Author.query.get(authorid)

        # 利用关联关系,根据作者查作者的书籍
        for book in author.books:
            # 删除作者的所有书籍
            db.session.delete(book)

        # 删除
        db.session.delete(author)

        # 提交
        db.session.commit()

    except Exception as e:
        flash("删除失败")
        # 删除失败回滚
        db.session.rollback()

        # 反回页面
        return redirect(url_for("index"))
    # 删除成功返回页面
    return redirect(url_for("index"))


if __name__ == '__main__':
    # 删除所有数据库表
    db.drop_all()
    # 创建数据库表
    db.create_all()

    # 生成数据
    au1 = Author(name='老王')
    au2 = Author(name='老尹')
    au3 = Author(name='老刘')
    # 把数据提交给用户会话
    db.session.add_all([au1, au2, au3])
    # 提交会话
    db.session.commit()
    bk1 = Book(name='老王回忆录', author_id=au1.id)
    bk2 = Book(name='我读书少,你别骗我', author_id=au1.id)
    bk3 = Book(name='如何才能让自己更骚', author_id=au2.id)
    bk4 = Book(name='怎样征服美丽少女', author_id=au3.id)
    bk5 = Book(name='如何征服英俊少男', author_id=au3.id)
    # 把数据提交给用户会话
    db.session.add_all([bk1, bk2, bk3, bk4, bk5])
    # 提交会话
    db.session.commit()

    # 2.运行web应用(会让flask运行测试服务器, 接收请求并转发给web应用)
    app.run(debug=True)

2.前端采用的模板渲染方式做的简单界面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>图书管理</h1>

<form method="post">
    <label>作者名: </label><input type="text" name="author_name" placeholder="请输入作者名"><br/>
    <label>书名: </label><input type="text" name="book_name" placeholder="请输入书名"><br/>
    <input type="submit" value="保存">
</form>

<hr>

<ul>
    {# 显示作者 #}
    {% for author in authors %}
        <li>{{ author.name }}<a href="/delete_author/{{ author.id }}"> 删除</a></li>
        <ul>
            {#        显示书籍信息#}
            {% for book in author.books %}
                <li>{{ book.name }} <a href="/delete_book?bookid={{ book.id }}"> 删除</a></li>
            {% endfor %}


        </ul>
    {% endfor %}
</ul>

<script>
    {% for message in get_flashed_messages() %}
        alert("{{ message }}")
    {% endfor %}

</script>
</body>
</html>

你可能感兴趣的:(PythonFlask)