flask 实现简易图书管理

"""
1.配置数据库
    a.导入 SQLalchemy库
    b.创建db对象,并配置参数
    c.创建数据库
    2.添加书和作者的模型
        a.模型集成db.Model
        b.__tablename__ :表名
        c.db.Column字段
        d.db.relationship 关系引用
3.添加数据
4.使用模板显示数据库查询数据
    a.查询所有的作者信息,让信息传递给模板
    b.模板中按照格式,依次for循环作者和书籍 (作者获取书记,用的是关系引用)
5.WTF显示表单
    a.自定义表单类
    b.模板中显示。
    c.设置secert_key,encoding,csrf_token
6.实现相关的增删逻辑
    b.网页中删除,点击需要发送书籍的ID给删除书籍的路由
    -》路由需要接受参数
"""
import sys

from flask import Flask, flash, request, redirect, url_for
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)

# 数据库配置,数据库地址/关闭自动跟踪修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'hamish'

# reload(sys)
sys.setdefaultencoding = ("UTF8")
db = SQLAlchemy(app)


# 创建数据库
# create database books charset =utf8;

# 定义书和作者模型
# 作者模型
class Author(db.Model):
    # 表名
    __tablename__ = 'authors'
    # Fileds
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)

    # 关系引用
    books = db.relationship('Book', backref='author')

    def __repr__(self):
        return 'Author :%s' % self.name


# 书籍模型
class Book(db.Model):
    __tablename__ = "books"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    author_id = db.Column(db.Integer, db.ForeignKey('authors.id'))

    def __repr__(self):
        return 'Books :%s  %s' % (self.name, self.author_id)


# 自定义表单类
class AuthorForm(FlaskForm):
    author = StringField("作者", validators=[DataRequired()])
    book = StringField("书籍", validators=[DataRequired()])
    submit = SubmitField("提交")


# 删除书籍
@app.route("/delete_book/<book_id>")
def delete_book(book_id):
    # 如何返回当前网值
    # 查询数据库,是否有该ID书,有就删除,没有提示错误

    # 重定义
    # redirect重定向,需要传入网址/路由地址
    # url_for(index):需要传入视图函数名,返回路由地址
    book = Book.query.get(book_id)
    if book:
        # 书籍存在,删除
        try:
            db.session.delete(book)
            db.session.commit()
        except Exception as e:
            print(e)
            flash("删除书籍出错")
            db.session.rollback()
    else:
        flash('书籍找不到!')
    return redirect(url_for('index'))


@app.route("/", methods=['GET', 'POST'])
def index():
    # 创建自定义的表单类
    author_form = AuthorForm()
    """
    验证逻辑:
    1.调用WTF的函数实现验证
    2,验证通过获取数据
    3,判断作者是否存在
    4,如果作者存在,判断书籍是否存在,如果没有重复书籍,添加数据。
    如果重复,提示错误。
    5,如果作者不存在,就添加作者和书籍。
    6.验证不通过提示错误。
    """
    # 1.调用WTF的函数实现验证
    if author_form.validate_on_submit():
        # 2.验证通过获取数据
        author_name = author_form.author.data
        book_name = author_form.book.data
        # 3.判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()

        # 4.如果作者存在
        if author:
            # 判断书籍是否存在,对书籍做查询操作
            book = Book.query.filter_by(name=book_name).first()
            # 如果重复就提示错误
            if book:
                flash("已存在同名书籍")
            else:
                # 没有重复就添加数据
                try:
                    new_book = Book(name=book_name, author_id=author.id)
                    db.session.add(new_book)
                    db.session.commit()
                except Exception as e:
                    print(e)
                    flash("添加书籍失败")
                    db.session.rollback()
        else:
            # 如果作者不存在,添加作者和书籍
            try:
                new_author = Author(name=author_name)
                db.session.add(new_author)
                db.session.commit()

                new_book = Book(name=book_name, author_id=new_author.id)
                db.session.add(new_book)
                db.session.commit()
            except Exception as e:
                print(e)
                flash("添加作者和书籍失败")
                db.session.rollback()

    else:
        if request.method == 'POST':
            flash("参数不全")

    # 查询所有作者信息,传递给模板
    authors = Author.query.all()
    return render_template("books.html", authors=authors, form=author_form)


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=au2.id)
    bk3 = Book(name="如何才能让自己更强大", author_id=au3.id)
    bk4 = Book(name="如何约妹子", author_id=au3.id)

    # 把数据交给会话
    db.session.add_all([bk1, bk2, bk3, bk4])
    # 提交会话
    db.session.commit()
    app.run(debug=True)

  使用的第三方模块,flask,pymysql,sqlalchemy

原文地址:https://www.cnblogs.com/hamish26/p/11393151.html