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

news/2024/5/20 17:37:58/文章来源:https://blog.csdn.net/weixin_39809168/article/details/111217326

这次给大家带来的是一个非常小的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_764701.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP 伪静态seo,伪静态、静态、动态网站对SEO的影响有多大?

我看过非常多的关于伪静态、静态、动态网站方面的一些知识&#xff0c;网上有非常多的说法&#xff0c;里边很多不懂装懂的人&#xff0c;胡说八道。甚至是有很多人转载别人的文章加工一下&#xff0c;就开始卖弄学问。最终的结果是&#xff0c;非常多的人不知道到底怎么做才对…

html 居中_SEO小龙人:HTML+CSS之display:inline-block实现三个标签并排居中显示

实现效果&#xff1a;<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv…

具体案例 快速原型模型_产品经理笔试知识点:白盒测试、开发模型、网站跳失率和RFM模型...

概述现今互联网产品经理的岗位的招聘原来越热门&#xff0c;笔者把网上搜集到的产品经理笔试易错题做了完整的解析和举例说明&#xff0c;每篇4道互联网产品经理笔试易错题&#xff0c;分析知识点&#xff0c;提升IT视野见识。本文主要介绍白盒测试&#xff0c;软件的几种常见开…

提升工作效率的那些网站——私藏工具推荐

提升工作效率的那些网站——私藏工具推荐 有哪些网站能提升你的工作效率&#xff1f; 分享一下那些能大幅提高工作效率的网站&#xff0c;都是我们一直在用并且认为在同类型中比较好用的。希望也能帮助到你。 梅花网—灵感素材 关于文案、新媒体的聚合网站&#xff0c;干货满…

推荐一个好玩网站,黑白照片上色、人脸识别都不是问题!

欢迎关注我的微信公号&#xff1a;小张Python! 大家好&#xff0c;我是 zeroing ~&#xff0c;今天给大家分享一个好玩的网站&#xff0c;只需把本地老照片上传&#xff0c;接下来网站就自动对黑白照片进行上色 老照片上色技术 其实已经出来很早了&#xff0c;去年 5 月份时 B…

词云绘制,推荐三种 Python包外加一个在线网站!

词云是文本可视化的重要方式&#xff0c;可将大段文本中的关键语句和词汇高亮展示&#xff0c; 本篇文章先介绍几种制作词云的 Python 库&#xff0c;分别是 WordCloud、StyleCloud、Pyecharts&#xff1b;再加一个在线词云制作网站&#xff1b;最后通过代码实操和可视化效果对…

Vue + Django + PaddleOCR 实现一个在线OCR 识别网站,一键上传快速识别

大家好&#xff0c;我是小张~ 之前写过一篇博文介绍了一款OCR 识别库&#xff0c;识别精度能达到商用级别&#xff0c;并且支持多语言识别&#xff0c;使用详情请参考文章&#xff1a;文本OCR&#xff0c;这个Python库识别效果不输于商用&#xff01;&#xff0c; 除了Paddle…

写一个简单的网站首页,初识 CSS 中 Flex 布局

之前一直用 VUE 写后台管理界面&#xff0c;对前端 CSS 这块一直是半知半解&#xff0c;为了巩固这方便知识&#xff0c;抽空写一些基础页面来巩固一下 今天带来的是一个简单的网站首页&#xff0c;源于《深入解析CSS》中的案例&#xff0c;首页做了简单的自适应&#xff0c;但…

印象笔记如何分享链接_杭州诠网科技分享seo优化如何做好网站的反向链接

几乎所有的网站管理员都希望自己的网站能够在百度、谷歌和其他搜索引擎中排名靠前。因为在搜索引擎排名靠前可以给网站带来很多新客户&#xff0c;这有利于网站产品或服务的营销和网站品牌的提升。虽然我们还没有找到一个神奇的公式来提高网站在搜索引擎中的排名。但是很多例子…

linux网站宝塔无法访问ipv6,centos7宝塔面板服务器开启纯IPV6访问

随着互联网世界日新月异的发展&#xff0c;ipv6好像已经成为一种必不可少的趋势&#xff0c;但是当前国内机房大部分还不能支持ipv6&#xff0c;腾讯云亦如此。同时&#xff0c;现在有部分程序在服务器上运行的时候&#xff0c;需要服务器能监听一个ipv6地址才行&#xff0c;因…

【伸手党福利】【第一弹】jeecg-boot前端主要更改位置(网站标题栏图标、logo、登录后的logo、显示的标题文字、用户头像)

【伸手党请光看标题】 网站标题栏图标 位置 ant-design-vue-jeecg\public\index.html 1、index.html标题在head第9行替换掉&#xff0c;然后复制ico到/public <link rel"shortcut icon" href"<% BASE_URL %>favicon.ico" type"image/x-ic…

关于百度机器人搜索你网站的页面权限设置

百度robots.txt上加 User-agent: * Disallow: / 这可能涉及到公司的网站是否存在信息泄露的风险

git 在线学习网站

Learn Git Branchinghttps://learngitbranching.js.org/?NODEMO&localezh_CN

在线测试键盘网站

在线键盘测试 | zFrontier 装备前线键盘测试工具&#xff0c;在线使用&#xff0c;无需下载&#xff0c;快速检测键盘好坏&#xff0c;兼容各种配列机械键盘、客制化键盘、薄膜键盘https://www.zfrontier.com/lab/keyboardTester

在线 YAML 转 Properties 网站

在线YAML转Properties工具- ToolTT在线工具箱https://tooltt.com/yaml2properties/

revel MySQL_使用Revel(go)开发网站

Revel很好的利用了Go语言的goroutine&#xff0c;把每一个request都分配到了goroutine里。不用再写一大堆的回调。如果你写过nodejs的话就会深刻的体会到callback hell是什么样子的。正是由于Revel有了goroutine&#xff0c;Revel的性能也有了很大的提升。官网号称请求的吞吐量…

SEO研究:网站结构

在衡量所有权重之间&#xff0c;网站结构大概占到30%&#xff0c;这也是很多网站排名不好&#xff0c;或者有站长根本不用优化就能获得很好排名的原因。说到结构必须明白两个概念&#xff0c;一个是物理概念,就是文件存放的路径&#xff0c;另一个是逻辑结构。比较好的情况是逻…

c 获取网站服务器时间,c 获取服务器的时间

c 获取服务器的时间 内容精选换一换当NTP服务器异常时产生该告警。当NTP服务器异常消除时&#xff0c;该告警恢复。主OMS节点配置的NTP服务器异常&#xff0c;可能会导致主OMS节点与外部服务器不能同步时间&#xff0c;集群时间可能会产生飘移。NTP服务器网络异常。与NTP服务器…

Silverlight SEO优化

Silverlight SEO优化SEO优化 2008年10月份&#xff0c;微软发布了针对Silverlight应用程序进行搜索引擎优化的指导文档&#xff0c;该文档描述了对Silverlight应用程序进行搜索 引擎优化一些最佳实践。这些实践知识可以帮助开发人员将他们开发的基于Silverlight的内容能够出现在…

[Python爬虫]模拟登陆**查网站

这是一篇使用Python模拟登陆##查网站的详细介绍&#xff0c;##查网站上有许多的企业信息&#xff0c;因此抓取##查数据十分重要&#xff0c;本文使用selenium模拟登陆##查网站。 其实我之前就想写这个python模拟登录网站的&#xff0c;因为之前爬虫用的时候感觉还挺好用的&…