我用Flask写了一个图书作者管理项目(附完整代码)

2019-10-31 16:00:40 浏览数 (1)

这次给大家带来的是一个非常小的Flask案例,刚好也与我们之前学习的Flask知识紧紧相结合。

首先看一下做出来的效果:

我们主要分为两部分来做,这两部分分别是上图的上部分的表单和下面的列表展示。

首先,我们需要通过flask_sqlalchemy来创建我们的数据表以及里面的数据:

代码语言:javascript复制
from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy
import pymysql
app = Flask(__name__)


class Config(object):
    # sqlalchemy的配置参数
    SQLALCHEMY_DATABASE_URI = "mysql pymysql://root:数据库密码@127.0.0.1:3306/author_book?charset=utf8"

    # 设置sqlalchemy自动跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = 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")


class Book(db.Model):
    '''书籍'''
    __tablename__ = "tbl_books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    author_id = db.Column(db.Integer,db.ForeignKey("tbl_authors.id"))

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    author_kuls = Author(name="kuls")
    author_wu = Author(name="吴承恩")
    author_luo = Author(name="罗贯中")
    db.session.add_all([author_kuls,author_luo,author_wu])
    db.session.commit()

    book_pac = Book(name="爬虫从入门到入狱",author_id=author_kuls.id)
    book_wu = Book(name="西游记",author_id=author_wu.id)
    book_luo = Book(name="三国演义",author_id=author_luo.id)
    db.session.add_all([book_luo,book_pac,book_pac])
    db.session.commit()

通过上面代码,我们创建了两个数据表并在数据表中添加了相关的数据,这里的操作我就不详细说明,之前的文章中已经全部介绍过了。

第一步我们成功做完,成功的通过flask_sqlalchemy创建了数据表和数据的导入。

既然数据解决了,接下来就是来写前端相关的东西了。首先我们来写一下底下的列表部分

首先,编写视图函数,给前端提供数据:

代码语言:javascript复制
@app.route("/")
def index():
    author_li = Author.query.all()
    return render_template("author_book.html", authors=author_li)

创建 author_book.html:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <ul>
       {% for author in authors %}
        <li>作者:{{author.name}}</li>
      <ul>
          {% for book in author.book %}
          <li>书籍:{{book.name}}</li>
          {% endfor %}

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

最后效果图:

写完了上部分的内容,下面我们接着来写表单,表单在系列前面的文章中也写过,所以这里详细的不说,我们直接来使用:

代码语言:javascript复制

class AuthorBookForm(FlaskForm):
    '''表单模型类'''
    author_name = StringField(label=u"作者", validators=[DataRequired(u"作者必填")])
    book_name = StringField(label=u"书籍", validators=[DataRequired(u"书籍必填")])
    submit = SubmitField(label=u"保存")

@app.route("/",methods=["POST","GET"])
def index():
    # 创建表单对象
    form = AuthorBookForm()
    # 如果提交成功
    if form.validate_on_submit():
        author_name = form.author_name.data
        book_name = form.book_name.data
        # 保存至数据库
        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.all()
    return render_template("author_book.html", authors=author_li,form = form)

我们创建一个表单模型类,并且在视图函数中进行表单数据的获取和储存。

代码语言:javascript复制
 <form method="post">
       {{form.csrf_token}}
       {{form.author_name.label}}
    <p>{{form.author_name}}</p>
       {% for msg in form.author_name.errors %}
       <p>{{msg}}</p>
       {% endfor%}

       {{form.book_name.label}}
    <p>{{form.book_name}}</p>
       {% for msg in form.book_name.errors %}
       <p>{{msg}}</p>
       {% endfor%}

       {{form.submit}}
   </form>

整体的视图函数逻辑很简单,首先获取到表单内容然后将其保存至数据库,最后执行查询数据库。通过这样每次我们点击提交按钮时会自动刷新列表里的内容。

接下来我们再为这个项目添加一个删除功能,整体的思路很简单,通过get请求拿到前端发送过来的book_id,后端再对这个book_id进行删除处理。

代码语言:javascript复制
@app.route("/delete_book")
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"))

前端在书籍下面加一个a标签即可:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <form method="post">
       {{form.csrf_token}}
       {{form.author_name.label}}
    <p>{{form.author_name}}</p>
       {% for msg in form.author_name.errors %}
       <p>{{msg}}</p>
       {% endfor%}

       {{form.book_name.label}}
    <p>{{form.book_name}}</p>
       {% for msg in form.book_name.errors %}
       <p>{{msg}}</p>
       {% endfor%}

       {{form.submit}}
   </form>

<hr>
   <ul>
       {% for author in authors %}
        <li>作者:{{author.name}}</li>
      <ul>
          {% for book in author.book %}
          <li>书籍:{{book.name}}</li>
          <a href="/delete_book?book_id={{book.id}}">删除</a>
          {% endfor %}

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

整体的项目差不多就在这里结束了,当然你也可以自己去添加一些小功能。

完整代码:

author.py:

代码语言:javascript复制
from flask import Flask,render_template,request,url_for,redirect
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)


class Config(object):
    # sqlalchemy的配置参数
    SQLALCHEMY_DATABASE_URI = "mysql pymysql://root:liusHuang@123@127.0.0.1:3306/author_book?charset=utf8"
    SECRET_KEY = "fasnfjaksndddasd123"
    # 设置sqlalchemy自动跟踪数据库
    SQLALCHEMY_TRACK_MODIFICATIONS = 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")


class Book(db.Model):
    '''书籍'''
    __tablename__ = "tbl_books"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    author_id = db.Column(db.Integer,db.ForeignKey("tbl_authors.id"))


class AuthorBookForm(FlaskForm):
    '''表单模型类'''
    author_name = StringField(label=u"作者", validators=[DataRequired(u"作者必填")])
    book_name = StringField(label=u"书籍", validators=[DataRequired(u"书籍必填")])
    submit = SubmitField(label=u"保存")

@app.route("/",methods=["POST","GET"])
def index():
    # 创建表单对象
    form = AuthorBookForm()
    # 如果提交成功
    if form.validate_on_submit():
        author_name = form.author_name.data
        book_name = form.book_name.data
        # 保存至数据库
        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.all()
    return render_template("author_book.html", authors=author_li,form = form)


@app.route("/delete_book")
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"))

if __name__ == '__main__':
    # db.drop_all()
    # db.create_all()
    # author_kuls = Author(name="kuls")
    # author_wu = Author(name="吴承恩")
    # author_luo = Author(name="罗贯中")
    # db.session.add_all([author_kuls,author_luo,author_wu])
    # db.session.commit()
    #
    # book_pac = Book(name="爬虫从入门到入狱",author_id=author_kuls.id)
    # book_wu = Book(name="西游记",author_id=author_wu.id)
    # book_luo = Book(name="三国演义",author_id=author_luo.id)
    # db.session.add_all([book_luo,book_pac,book_pac])
    # db.session.commit()
    app.run(debug=True)

author_book.html:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <form method="post">
       {{form.csrf_token}}
       {{form.author_name.label}}
    <p>{{form.author_name}}</p>
       {% for msg in form.author_name.errors %}
       <p>{{msg}}</p>
       {% endfor%}

       {{form.book_name.label}}
    <p>{{form.book_name}}</p>
       {% for msg in form.book_name.errors %}
       <p>{{msg}}</p>
       {% endfor%}

       {{form.submit}}
   </form>

<hr>
   <ul>
       {% for author in authors %}
        <li>作者:{{author.name}}</li>
      <ul>
          {% for book in author.book %}
          <li>书籍:{{book.name}}</li>
          <a href="/delete_book?book_id={{book.id}}">删除</a>
          {% endfor %}

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

0 人点赞