Flask+MySQL编写简单的图书管理系统

2 篇文章 0 订阅
1 篇文章 0 订阅

首先我们先保证已经安装了flask、mysql和wtf,通过pychrom新建一个Flask工程,在pychrom中将解释器选择为我们虚拟环境中安装的Flask包,比如我的是.virtualenv里面的flask_py3,(注意我这里使用的是python3,和python2有很大区别,你可以参考我的上一篇播客python3如何使用mysql) ,选择好之后,就会有一个py文件和两个文件夹,在templates新建一个books.html,如图所示
工程文件
我们先理清我们的实现步骤,下面是大概的步骤

"""
1.配置数据库
2.添加书和作者模型
3.添加数据
4.使用模板显示数据库数据
5.使用WTF表单
    自定义表单
    模板中显示
    secret_key/csrf_token
6.实现相关的增删逻辑
    a.增加数据
    b.删除书籍信息 --》网页中删除--》点击发送书籍id给删除书籍的路由
    url_for的使用,for - eles的使用 ,redirect的使用
    c.删除作者
"""

创建好工程后,我们在Flask_books_project.py中进行代码编写,我们先导入需要用到的包

from flask import Flask, render_template, flash, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
  1. 设置数据库连接和通讯
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:密码@127.0.0.1/flask_books"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config["SECRET_KEY"] = "12345678"
db = SQLAlchemy(app)
  1. 添加书和作者模型
# 定义书和作者模型
# 定义作者模型
class Author(db.Model):
    # 表名
    __tablename__ = "authors"
    # 字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    # 关系引用relationship
    books = db.relationship('Book', backref='author')

    def __repr__(self):
        return "Author %s" % self.name


# 定义书模型
class Book(db.Model):
    __tablename__ = "books"
    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)

5.使用WTF表单
自定义表单

# 自定义表单类
class AuthorForm(FlaskForm):
    author = StringField('作者', validators=[DataRequired()])
    book = StringField('书籍', validators=[DataRequired()])
    submit = SubmitField('提交')

6.实现相关的增删逻辑(路由实现)
a.增加数据
b.删除书籍信息 --》网页中删除–》点击发送书籍id给删除书籍的路由
url_for的使用,for - eles的使用 ,redirect的使用
c.删除作者

@app.route('/', methods=['GET', 'POST'])
def index():
    # 创建自定义表单
    author_form = AuthorForm()

    """
    1. 调用WTF函数验证
    2. 验证通过获取数据
    3. 判断作者是否存在
    4. 如果作者存在查询书籍是否存在,如果相同书籍则报错
    5. 如果作者不存在,则添加书籍和作者
    6. 验证不通过则报错
    """
    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:
                try:
                    new_book = Book(name=book_name, author_id=author.id)
                    db.session.add(new_book)
                    db.session.commit()
                except Exception as e:
                    print(e)
                    flash('添加书籍失败')
                    db.session.rollback()
        else:
            # 作者不存在,添加书籍
            try:
                new_author = Author(name=author_name)
                db.session.add(new_author)
                db.session.commit()

                new_book = Book(name=book_name, new_author_id=new_author.id)
                db.session.add(new_book)
                db.session.commit()
            except Exception as e:
                print(e)
                flash("添加作者和书籍失败")
                db.session.rollback()
    else:
        # 6. 验证不通过则报错
        if request.method == 'POST':
            flash('参数错误')

    # 查询所有的作者信息,传给模板
    authors = Author.query.all()
    return render_template('books.html', authors=authors, form=author_form)

# 删除作者
@app.route('/delete_author/<author_id>')
def delete_author(author_id):
    # 1查询数据库是否有该ID的作者,有就删除(先删书,再删作者),没有就报错
    author = Author.query.get(author_id)
    # 有就删除(先删书,再删作者)
    if author:
        try:
            Book.query.filter_by(author_id=author.id).delete()

            db.session.delete(author)
            db.session.commit()

        except Exception as e:
            print(e)
            flash("删除作者失败")
            db.session.rollback()
    else:
        print("未查询到作者")

    return redirect(url_for('index'))


# 删除书籍
@app.route('/delete_book/<book_id>')
def delete_book(book_id):
    # 1查询数据库是否有该ID,有就删除,没有就报错
    book = Book.query.get(book_id)
    # 2 如果有就删除
    if book:
        try:
            db.session.delete(book)
            db.session.commit()
        except Exception as e:
            print(e)
            flash("删除书籍出错")
            db.session.rollback()
    else:
        flash("找不到书籍")

    return redirect(url_for('index'))
    # 如何返回网址 --》重定向
    # redirect 重定向需要传入一个网址
    # url_for需要传入视图函数名,返回该视图函数的路由地址

3.添加数据,在主函数中添加数据

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    au1 = Author(name="老王")
    au2 = Author(name="老李")
    db.session.add_all([au1, au2])
    db.session.commit()
    bk1 = Book(name="我书读得多好", author_id=au1.id)
    bk2 = Book(name="我书读得少", author_id=au2.id)
    bk3 = Book(name="你别骗我", author_id=au2.id)
    db.session.add_all([bk1, bk2, bk3])
    db.session.commit()

    app.run()

到这里python的代码就完成了,接下来就是网页的设计,界面如下
books.html

4.使用模板显示数据库数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form method="post">
    {{ form.csrf_token()}}
    {{ form.author.label }}{{ form.author }}<br>
    {{ form.book.label }}{{ form.book }}<br>
    {{ form.submit }}<br>
    {# 显示消息闪现的内容 #}
    {% for message in get_flashed_messages()%}
        {{ message }}
    {% endfor %}
</form>

<hr>

{#<先遍历作者,在作者里查询书籍>#}
<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>
            {% else %}
                <li>无</li>
            {% endfor %}
        </ul>
    {% endfor %}
</ul>
</body>
</html>

到这里就基本上完成了,上面的步骤是我按我的代码从上到下介绍的,你可以按步骤的顺序来编程,这样会更加清晰,代码中也有注释,可以参考一下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值