"""
"""""
from flask import Flask, flash, redirect, render_template
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
# 数据库配置信息
class Config(object):
SECRET_KEY = 'skdskxco'
SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@localhost:3306/library"
SQLALCHEMY_TRACK_MODIFICATIONS = False
app.config.from_object(Config)
db = SQLAlchemy(app)
# 编写模型类
# 一个作者可以写多本书
class Author(db.Model):
__tablename__ = 'authors'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
books = db.relationship("Book", backref='author', lazy='dynamic')
# 一本书只有一个作者
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
author_id = db.Column(db.ForeignKey(Author.id))
# 定义表单类
class BookForm(FlaskForm):
bookname = StringField(u'书名', validators=
[DataRequired()],render_kw={"placeholder":u'请输入用户名'})
authorname = StringField(u'作者', validators=
[DataRequired()], render_kw={"placeholder": u'请输入作者'})
submit = SubmitField(u'提交')
# 展示书籍
@app.route('/')
def index():
# 1创建表单
form = BookForm()
# 2 查询数据
authors = Author.query.all()
# 3.将数据渲染到页面
return render_template('file04.html', form=form, authors=authors)
# 添加书籍
@app.route('/add_book', methods=['POST'])
def add_book():
# 1.创建表单
form = BookForm()
# 2校验表单
if form.validate_on_submit():
# 获取到参数,作者名,书名
authorname = form.authorname.data
bookname = form.bookname.data
author = Author.query.filter(Author.name == authorname).first()
# 判断
if author:
# 查询作者底下,是否由该书名
book = Book.query.filter(Book.name == bookname, Book.author_id == author.id).first()
# 该书存在
if book:
flash(u'该作者已经由该书了')
else:
book = Book(name=bookname, author_id=author.id)
db.session.add(book)
db.session.commit()
else:
# 创建作者,和书,添加到数据库
author = Author(name=authorname)
db.session.add(author)
db.session.commit()
book=Book(name=bookname,author_id=author.id)
db.session.add(book)
db.session.commit()
# 3响应
return redirect('/')
# 删除书籍
@app.route('/delete_book/<int:id>')
def delete_book(id):
# 1根据编号获取到书籍
book = Book.query.get(id)
# 2删除,提交
db.session.delete(book)
db.session.commit()
# 3重定向到展示页面
return redirect("/")
# 删除作者和作者所有关联的书籍
@app.route('/delete_author/<int:id>')
def delete_author(id):
# 1.通过编号获取到作者对象
author = Author.query.get(id)
# 2获取到作者,所有的书籍
books = author.books
# 3删除书籍,作者,提交
for book in books:
db.session.delete(book)
db.session.delete(author)
db.session.commit()
# 4.重定向到显示页面
return redirect("/")
# @app.route('/')
# def index():
# return 'hello'
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>
</head>
<body>
<form action="/add_book" method="post">
{{ form.csrf_token }}
{{ form.bookname.lable }}
{{ form.bookname }}<br>
{# <br><br>#}
{{ form.authorname.label }}
{{ form.authorname }}
<br>
{{ form.submit }}
{% for message in get_flashed_messages() %}
<h4 style="color: blue">{{ message }}</h4>
{% endfor %}
</form>
<form action="">
<ul>
{% for author in authors %}
<li>{{ author.name }}<a href="{{ url_for('delete_author',id=author.id) }}">删除</a></li>
<ul>
{% for book in author.books %}
<li>{{ book.name }}<a href="{{ url_for('delete_book',id=book.id) }}">删除</a></li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</form>
</body>
</html>