web应用框架——Flask图书作者小案例

2020-06-15  本文已影响0人  思君_4cd3

一、功能描述

  1. 可以添加书籍
    如果作者存在,书籍存在,不能添加
    如果作者存在,书籍不存在,可以添加
    如果作者存在,可以添加
  2. 删除书籍
  3. 删除作者,同时删除作者所有的书籍
  4. 使用wtf表单完成

二、基础代码

1.配置数据库:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
host = 'localhost'
port = 3306
username = 'root'
password = 'root'
db = 'library'
connect_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username,password,host,port,db)
#  设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = connect_str

# 设置每次请求结束后自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 动态追踪设置
app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
# 显示原始sql
app.config['SQLALCHEMY_ECHO'] = True

# 数据库要和 app关联
db = SQLAlchemy(app)

2.创建模型类

# 编写模型类
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

3.显示页面

# 展示页面
@app.route('/')
def show_page():
    return render_template('library.html')

4.添加数据

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)

三、查询所有作者

class BookForm(FlaskForm):
    authorName = StringField(label='作者', validators=[DataRequired("作者不能为空")])
    bookName = StringField(label='书籍', validators=[DataRequired("书籍不能为空")])
    submit = SubmitField('添加')
# 展示页面
@app.route('/')
def show_page():
    # 查询所有作者
    authors = Author.query.all()
    return render_template('library.html', authors=authors)
<ul>
    {% for author in  authors %}
        <li>作者:老王 <a href="#">删除</a></li>
        <ul>
            <li>书籍:老王回忆录<a href="#">删除</a> </li>
        </ul>
    {% endfor %}

</ul>
<ul>
    {% for author in  authors %}
        <li>作者:{{ author.name }} <a href="#">删除</a></li>
        <ul>
            {% for book in author.books %}
                <li>书籍:{{ book.name }}<a href="#">删除</a> </li>
            {% endfor %}
        </ul>
    {% endfor %}

</ul>

四、添加书籍

from flask import Flask, render_template, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
host = 'localhost'
port = 3306
username = 'root'
password = 'root'
db = 'library11'
connect_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username,password,host,port,db)
#  设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = connect_str

# 设置每次请求结束后自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 动态追踪设置
app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
# 显示原始sql
app.config['SQLALCHEMY_ECHO'] = True

# 数据库要和 app关联
db = SQLAlchemy(app)

# 设置
app.config['SECRET_KEY'] = 'dadasdasdasd'
# 编写模型类
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
# 自定表单, 继承 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('library.html',bookForm=bookForm, authors=authors)

# 添加书籍
@app.route('/add_book', methods=['POST'])
def add_book():
    # 1、 创建表单
    bookForm =  BookForm()
    # 验证参数功能
    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 = 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()

    # 重定向到原来的页面
    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>
<h1>欢迎来到我们的图书小地摊</h1>
<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>

<ul>
    {% for author in  authors %}
        <li>作者:{{author.name}} <a href="#">删除</a></li>
        <ul>
            {% for book in  author.books %}
              <li>书籍: {{ book.name }}<a href="#">删除</a> </li>
            {% endfor %}

        </ul>
    {% endfor %}
</ul>

</body>
</html>

五、删除书籍

from flask import Flask, render_template, flash, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
host = 'localhost'
port = 3306
username = 'root'
password = 'root'
db = 'library11'
connect_str = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username,password,host,port,db)
#  设置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = connect_str

# 设置每次请求结束后自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 动态追踪设置
app.config['SQLALCHEMY_TRACK_MODUFICATIONS'] = True
# 显示原始sql
app.config['SQLALCHEMY_ECHO'] = True

# 数据库要和 app关联
db = SQLAlchemy(app)

# 设置
app.config['SECRET_KEY'] = 'dadasdasdasd'
# 编写模型类
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
# 自定表单, 继承 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('library.html',bookForm=bookForm, authors=authors)

# 添加书籍
@app.route('/add_book', methods=['POST'])
def add_book():
    # 1、 创建表单
    bookForm =  BookForm()
    # 验证参数功能
    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 = 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()

    # 重定向到原来的页面
    return redirect(url_for('show_page'))
# 删除书籍
@app.route('/delete_book/<int:book_id>')
def delete_book(book_id):
    # 获取书籍
    book = Book.query.get(book_id)
    # 删除书籍
    db.session.delete(book)
    db.session.commit()

    # 重定向到原来的页面
    return redirect(url_for('show_page'))

# 删除作者
@app.route('/delete_author/<int:author_id>')
def delete_author(author_id):
    """
     删除作者
    :param author_id:
    :return:
    """
    # 通过编号获取作者对象
    author = Author.query.get(author_id)
    # 删除 作者书籍
    # 查询作者所有的书
    for book in author.books:
        db.session.delete(book)
    # 删除作者
    db.session.delete(author)
    db.session.commit()
    # 重定向到原来的页面
    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>
<h1>欢迎来到我们的图书小地摊</h1>
<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>

<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>
上一篇 下一篇

猜你喜欢

热点阅读