app.py
"""
图书馆小案例:
功能描述:
1. 可以添加书籍
如果作者存在,书籍存在,不能添加
如果作者存在,书籍不存在,可以添加
如果作者不存在, 可以添加
2. 删除书籍
3. 删除作者, 同时删除该作者的所有书籍
思路分析:
1.创建表单wtf
2.配置数据库
3.具体功能操作
"""""
from flask import Flask, render_template, redirect, url_for, flash
from flask_wtf import FlaskForm
# from flask.ext.wtf import FlaskForm# 一样的和上面,多了ext,说明信息
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequired
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
#设置数据库配置信息
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:root@127.0.0.1:3306/test9"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #压制警告信息
#创建SQLAlchemy对象,关联app
db = SQLAlchemy(app)
#编写模型类
#作者(一方)
class Author(db.Model):
__tablename__ = 'authors'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(64),unique=True)
#关系属性和反向引用
books = db.relationship('Book',backref='author')
#书籍(多方)
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(64),unique=True)
#外键
author_id = db.Column(db.Integer,db.ForeignKey('authors.id')) #或者是, Author.id
#设置密码
app.config['SECRET_KEY'] = "jfkdjfkdkjf"
#自定义表单,继承自FlaskForm
class BookForm(FlaskForm):
authorName = StringField(label='作者',validators=[DataRequired('作者不能为空')])
bookName = StringField(label='书籍',validators=[DataRequired('书籍不能为空')])
submit = SubmitField('添加')
#展示页面
@app.route('/')
def show_page():
#创建表单,
bookForm = BookForm()
#查询数据库
authors = Author.query.all()
# 渲染到页面
return render_template('file03library.html',bookForm=bookForm,authors=authors)
#添加书籍
@app.route('/add_book', methods=['POST'])
def add_book():
#1.创建表单,通过提交的数据
bookForm = BookForm()
#2.验证参数和功能, validate_on_submit()
if bookForm.validate_on_submit():
#获取参数
author_name = bookForm.authorName.data #金庸
book_name = bookForm.bookName.data#天龙八部
#通过作者名称,查询作者对象
author = Author.query.filter(Author.name == author_name).first() #有金庸
#判断作者是否存在
if author:
# 通过书籍名称,查询书籍对象 数据库,古龙写了 天龙八部
book = Book.query.filter(Book.name == book_name,Book.author_id == author.id).first()
#判断书籍是否存在
if book:
flash('该作者有该书籍')
else:
#创建书籍对象,添加到数据库
book = Book(name=book_name,author_id=author.id)
db.session.add(book)
db.session.commit()
else:
#创建作者添加到数据库
author = Author(name=author_name)
db.session.add(author)
db.session.commit()
#创建书籍添加到数据库
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
#3.重新显示页面
return redirect(url_for('show_page'))
#删除书籍
@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
#1.根据编号获取书籍对象
book = Book.query.get(book_id)
#2.删除书籍
db.session.delete(book)
db.session.commit()
#3.重定向页面展示
return redirect(url_for('show_page'))
#删除作者
@app.route('/delete_author/<int:author_id>')
def delete_author(author_id):
#1.通过编号获取作者对象
author = Author.query.get(author_id)
#2.删除作者书籍
for book in author.books:
db.session.delete(book)
#3.删除作者对象
db.session.delete(author)
db.session.commit()
#4.重定向展示页面
return redirect(url_for('show_page'))
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()
app.run(debug=True)
模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/add_book", method="post">
{{ bookForm.csrf_token }}
{{ bookForm.authorName.label }}
{{ bookForm.authorName }}<br>
{{ bookForm.bookName.label }}
{{ bookForm.bookName }}<br>
{{ bookForm.submit }}<br>
{% for message in get_flashed_messages() %}
<p style="color: red">{{ message }}</p>
{% endfor %}
</form>
<hr>
<ul>
{% for author in authors %}
<li>作者: {{ author.name }}<a href="{{ url_for('delete_author',author_id=author.id) }}">删除</a></li>
<ul>
{% for book in author.books %}
<li>书籍: {{ book.name }} <a href="{{ url_for('delete_book',book_id=book.id) }}">删除</a></li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>
网友评论