html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>book书店</title>
</head>
<body>
<form method="POST">
{{ form.csrf_token() }}
{{ form.user.label }} {{ form.user }}<br>
{{ form.books.label }} {{ form.books }}<br>
{{ form.submit}}<br>
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
<hr>
{# 遍历作者信息 author 是作者表的实例 #}
<ul>{% for author in author_form %}
<li>{{ author.name }}
<a href="{{ url_for("delect_author",author_id=author.id)}}">删除</a>
</li>
{# 遍历 作者表中 虚拟的book 信息 然后取名字 #}
<ul>{% for book in author.book %}
<li>{{ book.name }}
{# 这里的删除超链接 传参book_id过去 #}
<a href="{{ url_for("delect",book_id=book.id) }}">删除</a>
</li>
{% else %}
<li>无</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
</body>
</html>
flask 文件
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
'''
@version: v2.7.13
@author: dongzhiwei
@license: Apache Licence
@contact: 986042572@qq.com
@site: http://blog.csdn.net/hqzxsc2006
@software: PyCharm Community Edition
# @FileName: book_test.py
# @Time : 2018/10/14 16:37
'''
'''
1.关联数据库
a.导入 sqlalchemy 扩展
b 创建db对象 配置参数
c.终端创建数据库
2.添加书 和作者模型
a 模型继承model
b 表名
c 字段
d relationship 关系引用
3.添加数据 网页中显示数据
4.使用模板显示数据库查询的数据
a 查询所有作者信息 让信息传给模板文件
b 按照格式 依次for循环作者和书籍(作者获取书籍 用的是关系引用)
5.使用WTF显示表单
6.实现相关的增删逻辑
'''
#导入请求文件 闪现flash jinja2 模板文件
from flask import Flask,render_template,request,flash,redirect,url_for
#这是 数据库相关的包文件
from flask_sqlalchemy import SQLAlchemy
#这是WTF相关的包文件 继承的表单
from flask_wtf import FlaskForm
#导入from数据类型之类的文件
from wtforms import StringField,SubmitField
#这里导入的是逻辑验证用的
from wtforms.validators import EqualTo,DataRequired
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@localhost/first_flask"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'dong'
db = SQLAlchemy(app)
'''
作者表author
id name 虚拟books
作品表book
id name author_id(外键) 虚拟author
'''
class Author(db.Model):
#定义 表名
__tablename__ = 'authors'
#定义字段
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(16),unique = True)
#关系引用
book = db.relationship('Book',backref = 'author')
def __repr__(self):
return "author %s" % (self.name)
class Book(db.Model):
__tablename__ = 'books'
id = 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)
#这里定义一个表单类 用来实现继承flaskform
class book_from(FlaskForm):
#验证 是否为空
user = StringField('作者:',validators=[DataRequired()])
books = StringField('作品名称:',validators = [DataRequired()])
submit = SubmitField('提交')
#实现删除数据 < >中间是实现传参用的 url
@app.route('/delect/<book_id>')
def delect(book_id):
#拿到bookid 如果有就删除 没有就提示
book = Book.query.get(book_id)
if book:
db.session.delete(book)
db.session.commit()
else:
flash("没有这条数据")
#删除之后 需要重定向回去 这里用到 redirect
#url_for 这里指向视图函数名 返回对应的视图路由
return redirect(url_for('index'))
#删除作者 如果删除作者 把书籍一起删除
@app.route('/delete_author/<author_id>')
def delect_author(author_id):
author = Author.query.get(author_id)
if author:
#如果有该作者 先删除书 再删除作者
#查询书籍 并且删除
Book.query.filter_by(author_id=author.id).delete()
#删除作者
db.session.delete(author)
db.session.commit()
#这个时候删除书籍 是依靠
Book.query.filter_by()
return redirect(url_for('index'))
@app.route('/',methods=['GET','POST'])
def index():
'''
验证逻辑
调用wtf 验证
2.验证通过获取数据
3.判断作者是否存在
4.如果作者存在 判断书籍是否存在 没有重复就添加数据 重复就提示错误
5.如果作者不存在 就添加作者
6. 验证不通过就提示错误
'''
#查询到书籍库中作者的信息 然后传给模板
author_form = Author.query.all()
login_from = book_from()
#if request == 'POST':
#一句话验证 应该是验证上面的字符是否为空
if login_from.validate_on_submit():
#获取数据 判断作者是否存在filter_by
author_name = login_from.user.data
book_name = login_from.books.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:
# 添加书籍
book = Book(name=book_name, author_id=author.id)
db.session.add(book)
db.session.commit()
else:
# 添加书籍和作者
user = Author(name=author_name)
db.session.add(user)
db.session.commit()
add_book = Book(name=book_name, author_id=user.id)
db.session.add(add_book)
db.session.commit()
else:
if request.method == 'POST':
flash('参数不完整')
return render_template('book_test.html',author_form= author_form,form = login_from)
if __name__ == '__main__':
db.drop_all()
db.create_all()
author = Author(name = '小明')
author2 = Author(name = '小黑')
db.session.add_all([author,author2])
db.session.commit()
book1 = Book(name="肖生克的救赎",author_id = author.id)
book2 = Book(name ='flask入门',author_id = author2.id)
book3 = Book(name="jaba web", author_id=author2.id)
book4 = Book(name="时间简史", author_id=author.id)
db.session.add_all([book1,book2,book3,book4])
db.session.commit()
app.run(debug=Tr