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
每天进步一点