flask session_用Flask写一个图书作者管理网站(附完整代码)

这次给大家带来的是一个非常小的Flask案例,首先看一下做出来的效果:

d8a3beec9c9fd874018cd9531b750aef.png

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

如果你还没用过 flask,可以先看一下其官方文档的快速入门:

http://docs.jinkan.org/docs/flask/quickstart.html

了解如何创建并运行一个简单的 flask 网站应用。

另外,因为这里我们用到了 flask_sqlalchemy,所以你也需要安装它。

http://www.pythondoc.com/flask-sqlalchemy/quickstart.html

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

from flask import Flask,render_templatefrom flask_sqlalchemy import SQLAlchemyimport pymysqlapp = 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 = Trueapp.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()

通过上面代码,我们创建了两个数据表并在数据表中添加了相关的数据。

ef6a9c50cb417b2d1bf367fbae0b9cde.png

ac26406efeb9f3a3f1136e961084023d.png

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

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

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

@app.route("/")def index():    author_li = Author.query.all()    return render_template("author_book.html", authors=author_li)

创建 author_book.html:

<html lang="en"><head>    <meta charset="UTF-8">    <title>Titletitle>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>

最后效果图:

64147cb1a5668afb3a135218450875d1.png

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

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)

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

   <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进行删除处理。

@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标签即可:

<html lang="en"><head>    <meta charset="UTF-8">    <title>Titletitle>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:

from flask import Flask,render_template,request,url_for,redirectfrom flask_sqlalchemy import SQLAlchemyfrom flask_wtf import FlaskFormfrom wtforms import StringField,SubmitFieldfrom wtforms.validators import DataRequiredapp = 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 = Trueapp.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:

<html lang="en"><head>    <meta charset="UTF-8">    <title>Titletitle>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>

作者:JAP君 

来源:Python进击者 


ba3bad91233f4a9c2d41f2e8f7f40678.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值