1.文件结构:
2.实验效果:
3.主文件Flask_books_project.py:
from flask_wtf import FlaskForm
from sqlalchemy.orm import relationship
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column,String,Integer,ForeignKey
from wtforms.validators import DataRequired,EqualTo,Length
from flask import Flask,render_template,flash,request,redirect,url_for
from wtforms import StringField,FieldList,SubmitField,PasswordField,TelField
app=Flask(__name__)
app.secret_key='books'
#配置数据库
class Config:
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root@127.0.0.1:3306/flask_books'
SQLALCHEMY_TRACK_MODIFICATIONS=False
app.config.from_object(Config)
mysql=SQLAlchemy(app)
#添加书和作者的模型
class Author(mysql.Model):
#表名
__tablename__='authors'
id=Column(Integer,primary_key=True)
name=Column(String(128),unique=True)
#关系引用
#books是为自己创建的,author为BOOKS创建的
books=relationship('Book',backref='author')
#重写输出方法
def __repr__(self):
return 'Author: %s'%(self.name)
class Book(mysql.Model):
#表名
__tablename__='books'
id=Column(Integer,primary_key=True)
name=Column(String(128),unique=True)
author_id=Column(Integer,ForeignKey('authors.id'))
def __repr__(self):
return 'Book: %s : %s'%(self.name,self.author_id)
#主定义表单类
class AuthorForm(FlaskForm):
author=StringField(label='作者',validators=[DataRequired()])
book=StringField(label='书籍',validators=[DataRequired()])
submit=SubmitField(label='提交')
#删除书籍的操作
@app.route('/delete_books/<int:book_id>',methods=['POST','GET'])
def delete_book(book_id):
#查询数据库,是否存在该书籍
book=Book.query.get(book_id)
if book:
try:
mysql.session.delete(book)
mysql.session.commit()
mysql.session.close()
except Exception as e:
flash('删除书籍异常')
mysql.session.rollback()
else:
flash('不存在该书籍')
#跳转到index页面
return redirect(url_for('index'))
#删除作者的操作
@app.route('/delete_authors/<int:author_id>',methods=['POST','GET'])
def delete_authors(author_id):
#查询数据库,是否存在该作者(先删除书籍,再删除作者)
author=Author.query.get(author_id)
if author:
try:
#查询并删除书籍
book=Book.query.filter_by(author_id=author.id)
if book:
book.delete()
mysql.session.delete(author)
mysql.session.commit()
mysql.session.close()
except Exception as e:
flash('删除作者异常')
mysql.session.rollback()
else:
flash('不存在该作者')
#跳转到index页面
return redirect(url_for('index'))
#使用模版显示数据库查询的数据
@app.route('/index',methods=['POST','GET'])
def index():
#创建自定义的表单类
author_form=AuthorForm()
if request.method=='POST':
if author_form.validate_on_submit():
author_name=author_form.author.data
book_name=author_form.book.data
#判断作者是否存在时数据库中
author=Author.query.filter_by(name=author_name).first()
if author:
#判断书籍是否存在数据库中
book=Book.query.filter_by(name=book_name).first()
if book:
flash('已存在该书籍')
else:
flash('书籍不存在数据库中')
try:
new_book=Book(name=book_name,author_id=author.id)
mysql.session.add(new_book)
mysql.session.commit()
mysql.session.close()
except Exception as e:
flash('出现异常-添加书籍失败')
#撤销
mysql.session.rollback()
else:
flash('作者不存在数据库中')
try:
new_author=Author(name=author_name)
mysql.session.add(new_author)
mysql.session.commit()
new_book=Book(name=book_name,author_id=new_author.id)
mysql.session.add(new_book)
mysql.session.commit()
mysql.session.close()
except Exception as e:
flash('添加作者和书籍失败')
#撤销
mysql.session.rollback()
else:
#提交的信息不通过就提示错误
flash('验证不过')
#查询所有作者的信息,将信息专递给模版
authors=Author.query.all()
return render_template('books.html',authors=authors,author_form=author_form)
if __name__ == '__main__':
print('Pycharm')
# mysql.drop_all()
mysql.create_all()
# 生成数据
# au1 = Author(name='TOYKL')
# au2 = Author(name='ROCML')
# au3 = Author(name='WTANK')
# # 把数据提交给用户会话
# mysql.session.add_all([au1, au2, au3])
# # 提交会话
# mysql.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)
# # 把数据提交给用户会话
# mysql.session.add_all([bk1, bk2, bk3, bk4, bk5])
# # 提交会话
# mysql.session.commit()
app.run(debug=True)
4.前端文件books.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
a {
text-decoration:none;
}
</style>
</head>
<body>
<form action="" method="POST">
{{author_form.csrf_token()}}
{{author_form.author.label}}{{author_form.author}}<br>
{{author_form.book.label}}{{author_form.book}}<br>
{{author_form.submit}}
<!-- 显示消息闪现的内容-->
{% for message in get_flashed_messages() %}
{{message}}
{% endfor %}
</form>
<hr>
<!-- 先遍历作者,然后再在作者中遍历书籍 -->
<ul>
{% for author in authors %}
<li>{{author.name}}<a href="{{url_for('delete_authors',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>
{% else %}
<li>无</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>