zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    PAT 1012 数字分类
    PAT 1046 划拳
    PAT 1021 个位数统计
    PAT 1003 我要通过!
    PAT 1031 查验身份证
    安装swoole
    PHP yield 分析,以及协程的实现,超详细版(上)
    PHP性能优化利器:生成器 yield理解
    swoole深入学习 8. 协程 转
    swoole| swoole 协程初体验 转
  • 原文地址:https://www.cnblogs.com/hamish26/p/11393151.html
Copyright © 2011-2022 走看看