1 #! /usr/bin/env python 2 # *-* coding: utf-8 *-* 3 4 5 from flask import Flask, flash, redirect 6 from flask import url_for 7 from flask import request 8 from flask_wtf import FlaskForm 9 from wtforms import StringField, SubmitField 10 from wtforms.validators import InputRequired 11 from flask import render_template 12 from flask_sqlalchemy import SQLAlchemy 13 14 app = Flask(__name__) 15 16 # 配置数据库连接地址 17 app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:qw123666@localhost/test?charset=utf8" 18 # 是否追踪数据库的修改 19 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 20 app.config["SQLALCHEMY_ECHO"] = False 21 app.secret_key = "123456" 22 23 # 初始化 SQLAlchemy 对象 24 db = SQLAlchemy(app) 25 26 27 # 定义模型类-作者 28 class Author(db.Model): 29 __tablename__ = 'author' 30 id = db.Column(db.Integer, primary_key=True) 31 name = db.Column(db.String(32), unique=True) 32 book = db.relationship('Book', backref='author') 33 34 # def __repr__(self): 35 # return 'Author:%s' % self.name 36 37 38 # 定义模型类-书名 39 class Book(db.Model): 40 __tablename__ = 'books' 41 id = db.Column(db.Integer, primary_key=True) 42 name = db.Column(db.String(32)) 43 author_id = db.Column(db.Integer, db.ForeignKey(Author.id)) 44 45 # def __str__(self): 46 # return 'Book:%s,%s' % (self.info, self.lead) 47 48 49 class AddBookForm(FlaskForm): 50 author = StringField("作者", validators=[InputRequired("请输入作者名")]) 51 book = StringField("书名", validators=[InputRequired("请输入书名")]) 52 submit = SubmitField("添加") 53 54 55 @app.route("/index", methods=["get", "post"]) 56 def index(): 57 # 获取所有的作者 58 bookform = AddBookForm() 59 if request.method == "POST": 60 # 取值 61 if bookform.is_submitted(): 62 author_name = bookform.author.data 63 book_name = bookform.book.data 64 # 查指定作者的名字是否存在 65 author = Author.query.filter(Author.name == author_name).first() 66 if not author: 67 try: 68 # 增加作者 69 author_obj = Author(name=author_name) 70 db.session.add(author_obj) 71 db.session.commit() 72 # 增加书名 73 book_obj = Book(name=book_name, author_id=author_obj.id) 74 db.session.add(book_obj) 75 db.session.commit() 76 except Exception as e: 77 db.session.rollback() 78 flash("添加失败") 79 else: 80 try: 81 book_obj = Book(name=book_name, author_id=author.id) 82 db.session.add(book_obj) 83 db.session.commit() 84 except Exception as e: 85 db.session.rollback() 86 flash("添加失败") 87 # 往数据开中写入值 88 authors = Author.query.all() 89 return render_template("index.html", authors=authors, form=bookform) 90 91 authors = Author.query.all() 92 return render_template("index.html", authors=authors, form=bookform) 93 94 95 @app.route("/delete_author/<author_id>") 96 def delete_author(author_id): 97 author_obj = Author.query.get(author_id) 98 if author_obj: 99 try: 100 Book.query.filter(Book.author_id == author_id).delete() 101 db.session.delete(author_obj) 102 db.session.commit() 103 except Exception as e: 104 print("删除作者名失败") 105 db.session.rollback() 106 else: 107 flash("没有这个作者") 108 authors = Author.query.all() 109 bookform = AddBookForm() 110 111 return redirect(url_for('index')) 112 113 114 @app.route("/delete_book/<book_id>") 115 def delete_book(book_id): 116 try: 117 # 书的对象 118 book_obj = Book.query.get(book_id) 119 print(book_obj) 120 # 书的作者的id 121 author_id = book_obj.author.id 122 # author_id = book_obj.Author.id 123 print(author_id) 124 if book_obj: 125 db.session.delete(book_obj) 126 author_count = len(book_obj.author.book) 127 if author_count == 0: 128 # author_obj = Author.query.get(author_id) 129 author_objs = Author.query.filter(Author.id == author_id).all() 130 print("author_obj", author_objs) 131 for author_obj in author_objs: 132 db.session.delete(author_obj) 133 134 except Exception as e: 135 print("没有这本书") 136 db.session.commit() 137 138 authors = Author.query.all() 139 bookform = AddBookForm() 140 return render_template("index.html", authors=authors, form=bookform) 141 142 143 if __name__ == '__main__': 144 app.run(debug=True)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <form method="post" action="http://127.0.0.1:5000/index"> 9 {{ form.csrf_token() }}<br/> 10 {{ form.author.label }}{{ form.author }}<br/> 11 {{ form.book.label }}{{ form.book }}<br/> 12 {{ form.submit }}<br/> 13 {% for message in get_flashed_messages() %} 14 {{ message }} 15 {% endfor %} 16 </form> 17 <br/> 18 <h1>图书管理界面</h1> 19 <ul> 20 {% for author in authors %} 21 <li> {{ author.name }}<a href="/delete_author/{{ author.id }}">删除作者</a></li> 22 <ul> 23 {% for book in author.book %} 24 <li> {{ book.name }}<a href="/delete_book/{{ book.id }}">删除书名</a></li> 25 {% endfor %} 26 </ul> 27 {% endfor %} 28 </ul> 29 30 </body> 31 </html>