flask之图书作者小案例

本文通过五个步骤展示了如何使用Python的Flask框架和MySQL数据库进行图书作者信息的增删显示。首先配置数据库,创建作者和图书模型,然后在MySQL中创建数据表。接着创建添加表单,将数据展示在首页。最后实现添加记录和删除书籍的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先展示一下页面:
在这里插入图片描述


步骤一: 添加数据库

首先是数据库的配置

from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@192.168.152.156:3306/author_book'
    # 格式: mysql://用户名:密码@地址:端口/数据库
    SQLALCHEMY_TRACK_MODIFICATION = True

app.config.from_object(Config)

db = SQLAlchemy(app)

其次是创建作者和图书的模型类

class Author(db.Model):
    # 自定义数据表名
    __tablename__ = "tbl_authors"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    book = db.relationship("Book", backref="author")

    # 定义显示项
    def __repr__(self):
        return "Author Object: name=%s" % self.name

class Book(db.Model):
    # 自定义数据表名
    __tablename__ = "tbl_books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), unique=True)
    author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id"))

    # 定义显示项
    def __repr__(self):
        return "Book Object: name=%s" % self.name

最后创建数据库并且添加数据表
flask不会帮我们创建数据库,所以数据库需要在mysql自行创建。以下代码仅执行一次,之后注释掉即可。

if __name__ == "__main__":
    # 清空原始数据库
    db.drop_all()
    # 添加数据表
    db.create_all()
    # 添加数据库内容
    au_luo = Author(name="罗贯中")
    au_wu = Author(name="吴承恩")
    au_shi = Author(name="施耐庵")
    au_cao= Author(name="曹雪芹")
    db.session.add_all([au_luo, au_wu, au_shi, au_cao])
    db.session.commit()
    # 添加书本信息
    bk_san = Book(name="三国演义", author_id=au_luo.id)
    bk_xi = Book(name="西游记", author_id=au_wu.id)
    bk_shui = Book(name="水浒传", author_id=au_shi.id)
    bk_hong = Book(name="红楼梦", author_id=au_cao.id)
    db.session.add_all([bk_san, bk_xi, bk_shui, bk_hong])
    db.session.commit()

	app.run(debug=True)

步骤二:创建添加的表单

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

app.config["SECRET_KEY"] = "ashisahdoisahlfial124lohlf"

# 创建表单模型类
class AddForm(FlaskForm):
    author_name = StringField("作者", validators=[DataRequired("作者必填")])
    book_name = StringField("书籍", validators=[DataRequired("书名必填")])
    submit = SubmitField("添加")

@app.route("/", methods=["GET", "POST"])
def index():
    # 创建表单对象
    form = AddForm()
    return render_template("author_book.html", form=form)

表单页面 author_book.html

<form action="" method="POST">
   		{{ form.csrf_token() }} 
        <p>
            {{ form.author_name.label }} :&nbsp;
            {{ form.author_name }}
            {% for error in form.author_name.errors %}
                <p>{{ error }}</p>
       	    {% endfor %}
        </p>
        <p>
            {{ form.book_name.label }} :&nbsp;
            {{ form.book_name }}
            {% for error in form.book_name.errors %}
                <p>{{ error }}</p>
            {% endfor %}
        </p>
        <p>
            {{ form.submit }}
        </p>
</form>

步骤三: 将数据显示在首页

@app.route("/", methods=["GET", "POST"])
def index():
    # 创建表单对象
    form = AddForm()
    
    # 查询数据库(不显示没有书籍的作者)
    author_li = Author.query.filter(not_(Author.book==None)).all()
    
    return render_template("author_book.html", author_li=author_li, form=form)

在首页模板添加记录

<ul>
    {% for author in author_li %}
    <li>作者:{{ author.name }}</li>
    <ul>
        {% for book in author.book %}
        <li>{{ book.name }}&nbsp;&nbsp;&nbsp;<a href="/delete_book?book_id={{ book.id }}">删除</a></li>
        {% endfor %}
    </ul>
    {% endfor %}
</ul> 

步骤四:添加记录

    # 表单验证,只有当所有表单都验证通过时,才返回True
    if form.validate_on_submit():
        # 验证通过,提取表单数据
        author_name = form.author_name.data
        book_name = form.book_name.data
        # 添加数据到数据库
        # 判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()
        if author is None:
            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()

步骤五: 删除书籍

# /delete_book?book_id=...
@app.route("/delete_book", methods=["GET"])
def delete_book():
    # 获取参数
    book_id = request.args.get("book_id")
    # 删除数据
    book = Book.query.get(book_id)
    db.session.delete(book)
    db.session.commit()
    # 重定向到首页
    return redirect(url_for("index"))

整体代码:
book.py

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import not_
import pymysql
pymysql.install_as_MySQLdb()
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired


app = Flask(__name__)
app.config["SECRET_KEY"] = "ashisahdoisahlfial124lohlf"

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@192.168.152.156:3306/author_book'
    SQLALCHEMY_TRACK_MODIFICATION = True

app.config.from_object(Config)

db = SQLAlchemy(app)

class Author(db.Model):
    # 自定义数据表名
    __tablename__ = "tbl_authors"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    book = db.relationship("Book", backref="author")

    # 定义显示项
    def __repr__(self):
        return "Author Object: name=%s" % self.name

class Book(db.Model):
    # 自定义数据表名
    __tablename__ = "tbl_books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), unique=True)
    author_id = db.Column(db.Integer, db.ForeignKey("tbl_authors.id"))

    # 定义显示项
    def __repr__(self):
        return "Book Object: name=%s" % self.name

# 创建表单模型类
class AddForm(FlaskForm):
    author_name = StringField("作者", validators=[DataRequired("作者必填")])
    book_name = StringField("书籍", validators=[DataRequired("书名必填")])
    submit = SubmitField("添加")
    

@app.route("/", methods=["GET", "POST"])
def index():
    # 创建表单对象
    form = AddForm()
    # 表单验证,只有当所有表单都验证通过时,才返回True
    if form.validate_on_submit():
        # 验证通过,提取表单数据
        author_name = form.author_name.data
        book_name = form.book_name.data
        # 添加数据到数据库
        # 判断作者是否存在
        author = Author.query.filter_by(name=author_name).first()
        if author is None:
            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()
    
    # 查询数据库
    author_li = Author.query.filter(not_(Author.book==None)).all()
    
    return render_template("author_book.html", author_li=author_li, form=form)

# /delete_book?book_id=...
@app.route("/delete_book", methods=["GET"])
def delete_book():
    # 获取参数
    book_id = request.args.get("book_id")
    # 删除数据
    book = Book.query.get(book_id)
    db.session.delete(book)
    db.session.commit()
    # 重定向到首页
    return redirect(url_for("index"))

author_book.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>author_book</title>
</head>
<body>
    <form action="" method="POST">
        {{ form.csrf_token() }} 
        <p>
            {{ form.author_name.label }} :&nbsp;
            {{ form.author_name }}
            {% for error in form.author_name.errors %}
                <p>{{ error }}</p>
            {% endfor %}
        </p>
        <p>
            {{ form.book_name.label }} :&nbsp;
            {{ form.book_name }}
            {% for error in form.book_name.errors %}
                <p>{{ error }}</p>
            {% endfor %}
        </p>
        <p>
            {{ form.submit }}
        </p>
    </form>
    <ul>
        {% for author in author_li %}
        <li>作者:{{ author.name }}</li>
        <ul>
            {% for book in author.book %}
            <li>{{ book.name }}&nbsp;&nbsp;&nbsp;<a href="/delete_book?book_id={{ book.id }}">删除</a></li>
            {% endfor %}
        </ul>
        {% endfor %}
    </ul> 
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值