Python轻量级Web框架Flask(9)——图书馆项目

2023-11-14

1、项目要求:

  • 创建一个项目,用来说明出版社,书籍和作者的关系。
  • 作者和书籍之间的关系:1对多(一本书由一个作者完成,一本书可以有多个创作者)
  • 出版社和书籍之间的关系:多对多(一个出版社可以出版多本书,一本书可以由多个出版社出版)
  • 要求:
    • 1.在书籍的book_index.html中有一个”查看所有书籍“的超链接按钮,点击进入书籍列表book_list.html页表。
    • 2.在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html。
    • 3.在书籍book_detail.html中可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情publisher_detail.html页面。

2、项目模板:


3、第一步:在models中写好表结构:

# models.py : 模型,数据库

'''
    模型      ===      数据库
    类        ——>     表结构
    类属性     ——>    表字段
    一个对象   ——>    表的一行数据
'''


from .exts import db

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型

# 作者
class Author(db.Model):
    __tablename__ = 'author'  # 表名,如果不写表名,也会自动生成(类名小写),表名一定要小写!
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))
    age = db.Column(db.Integer, default=1)
    sex = db.Column(db.Boolean, default=True)   # True表示男
    email = db.Column(db.String(200))
    # 关系:Author可以调用books,Book可以反向调用my_auther
    books = db.relationship('Book', backref='my_auther', lazy='dynamic')
# 中间表(书籍-出版社)
book_publish = db.Table(
    'book_publisher',
    db.Column('book_id', db.Integer, db.ForeignKey('book.id'), primary_key=True),
    db.Column('publisher_id', db.Integer, db.ForeignKey('publisher.id'), primary_key=True)
)
# 书籍
class Book(db.Model):
    __tablename__ = 'book'  # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), unique=True)
    date = db.Column(db.DateTime)   # 书籍日期
    # 1对多:外键
    author_id = db.Column(db.Integer, db.ForeignKey(Author.id))
# 出版社
class Publisher(db.Model):
    __tablename__ = 'publisher'  # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    address = db.Column(db.String(200))
    city = db.Column(db.String(100))
    province = db.Column(db.String(100))
    country = db.Column(db.String(100))
    website = db.Column(db.String(100))
    # 多对多,关联book表,secondary是设置中间表
    books = db.relationship('Book', backref='publishers', secondary=book_publish, lazy='dynamic')


4、第二步:进行数据迁移

  • 1、在pycharm中将项目_05_TuShuGuanXiangMu拖到终端中(改变终端路径)
  • 2、在终端执行:flask db init 数据库初始化
  • 3、在终端执行:flask db migrate
  • 4、在终端执行:flask db upgrade
  • 最终执行结束会生成migrations文件夹

5、第三步:创建书籍相关页面:

在这里插入图片描述


6、第四步:给数据库添加测试数据:以作者数据库为例说明

在这里插入图片描述
总结:添加数据可以在pycharm专业版自带的数据库中操作如上,也可以在workbench中操作(一种界面操作,一种SQL语句操作)。


注意:本项目第五步和第六步是同步测试编写的

7、第五步:其余python代码展示

app

from App import creat_app

app = creat_app()


if __name__ == '__main__':
    app.run(debug=True)

__init __

# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts

def creat_app():
    app = Flask(__name__)

    # 注册蓝图
    app.register_blueprint(blueprint=blue)

    # 配置数据库
    # db_uri = 'sqlite:///sqlite3.db'
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/bookdb' # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改

    # 初始化插件
    init_exts(app=app)

    return app

exts

from flask_sqlalchemy import SQLAlchemy # ORM(对象关系映射)
from flask_migrate import Migrate   # 数据迁移

db = SQLAlchemy()
migrate = Migrate()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app,db=db)

views

# 在views.py中放路由和视图函数

from flask import Blueprint, request, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('book', __name__)

@blue.route('/')
@blue.route('/bookindex/')
def book_index():
    return render_template('book_index.html')

@blue.route('/booklist/')
def book_list():
    books = Book.query.all()
    return render_template('book_list.html', books=books)

@blue.route('/bookdetail/<int:bid>/')   # 路由传参
def book_detail(bid):
    book = Book.query.get(bid)
    return render_template('book_detail.html', book=book)

# 作者详情
@blue.route('/authordetail/<int:aid>/')   # 路由传参
def author_detail(aid):
    author = Author.query.get(aid)
    return render_template('author_detail.html', author=author)

# 出版社详情
@blue.route('/publisherdetail/<int:pid>/')   # 路由传参
def publisher_detail(pid):
    publisher = Publisher.query.get(pid)
    return render_template('publisher_detail.html', publisher=publisher)

8、第六步:templates中所有页面代码展示

author_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>作者详情</title>
</head>
<body>
    <h2>作者详情</h2>
    <p>作者姓名:{{ author.name }}</p>
    <p>作者年龄:{{ author.age }}</p>
    <p>作者性别:{{ author.sex }}</p>
    <p>作者Email:{{ author.email }}</p>
    <hr>
    <h3>作者作品集合:</h3>
    <p>
        {% for book in author.books %}
            <a href="/bookdetail/{{ book.id }}/">《{{ book.title }}》</a>
            {% if not loop.last %}|{% endif %}
        {% endfor %}

    </p>
</body>
</html>

book_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍详情</title>
</head>
<body>
    <h2>《{{ book.title }}》</h2>
    <p>书籍出版时间:{{ book.date }}</p>
    <p>作者:
        <a href="/authordetail/{{ book.my_author.id }}/">{{ book.my_author.name }}</a>
    </p>
    <p>出版社:
        {% for publisher in book.publishers %}
            <a href="/publisherdetail/{{ publisher.id }}/">{{ publisher.name }}</a> |
        {% endfor %}
    </p>

</body>
</html>

book_index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍首页</title>
</head>
<body>
    <h2>书籍首页</h2>
    <a href="/booklist/">查看所有书籍</a>
</body>
</html>

book_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍列表</title>
</head>
<body>
    <h2>书籍列表</h2>
    <ul>
        {% for book in books %}
            <li>
                <a href="/bookdetail/{{ book.id }}/">{{ book.title }}</a>
            </li>
        {% endfor %}
    </ul>
</body>
</html>

publisher_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>出版社详情</title>
</head>
<body>
    <h2>出版社详情</h2>
    <p>出版社名称:{{ publisher.name }}</p>
    <p>出版社地址/城市/省份/国家:{{ publisher.address }}/{{ publisher.city }}/{{ publisher.province }}/{{ publisher.conuntry }}</p>
    <p>出版社网址:{{ publisher.website }}</p>
    <hr>
    <p>出版社出版过的书籍:
        {% for book in publisher.books %}
            <a href="/bookdetail/{{ book.id }}/">《{{ book.title }}》</a>
            {% if not loop.last %}|{% endif %}
        {% endfor %}
    </p>

</body>
</html>

总结:

  • 完成该项目的前提是对Flask模型有足够的认识。
  • 可以看出在Flask模型中,models中主要是进行建立表结构的操作(一对多,多对多)。
  • 在Flask模型中,views主要是进行页面调用和数据库表的增删改查。
  • 在Flask模型中,exts主要就是放插件和拓展。
  • 在Flask模型中,init主要就是初始化。
  • 在Flask模型中,app就是主程序,整个程序从这里启动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python轻量级Web框架Flask(9)——图书馆项目 的相关文章

  • 如何将本机 popcount 与 numba 一起使用

    我正在使用 numba 0 57 1 我想在我的代码中利用本机 CPU popcount 我现有的代码太慢 因为我需要运行它数亿次 这是一个 MWE import numba as nb nb njit nb uint64 nb uint6
  • 如何测试使用 XCom 的 Apache Airflow 任务

    我正在尝试找出一种测试 DAG 的方法 其中有几个任务使用 XCom 进行通信 由于控制台命令只允许我从 DAG 运行任务 有没有一种方法可以测试通信而无需通过 UI 运行 DAG Thanks 这是一种对我有用的方法 尽管 Airflow
  • 如何忽略传递给函数的意外关键字参数?

    假设我有一些功能 f def f a None print a 现在 如果我有一本字典 比如dct a Foo 我可以打电话f dct 并得到结果Foo打印 但是 假设我有一本字典dct2 a Foo b Bar 如果我打电话f dct2
  • pip 安装失败,SSL 证书验证失败 (_ssl.c:833)

    我无法通过 pip install 安装任何外部 python 模块 我已经正确安装了 python 但如果我使用 pip install 它会显示此错误 这是我运行后的代码pip install pytesseract C Users 1
  • Python grpc protobuf 存根生成问题:--grpc_out: protoc-gen-grpc: 插件失败,状态代码 1

    正如问题所说 我从源代码编译了 grpc 并且也做了sudo pip install grpcio 但是 那which grpc python plugin不返回任何内容 这是一个问题 因为route guide的grpc python示例
  • 蜘蛛内的Scrapyd jobid值

    Scrapy 框架 Scrapyd 服务器 我在获取蜘蛛内部的 jobid 值时遇到一些问题 将数据发布到后http localhost 6800 schedule json http localhost 6800 schedule jso
  • 小数缓存是Python规范中定义的还是一个实现细节?

    Python 似乎有一个所谓的 小数字缓存 用于存储 5 到 256 范围内的数字 我们可以使用以下程序来演示这一点 for i in range 7 258 if id i id i 0 print i is cached else pr
  • Seaborn 热图中的自定义调色板间隔

    我正在尝试绘制一个heatmap https seaborn pydata org generated seaborn heatmap html使用seaborn库 绘图函数如下所示 def plot confusion matrix da
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • PyCharm 无法识别字典值类型

    我有一个简单的代码片段 其中我将字典值设置为空列表 new dict for i in range 1 13 new dict i 现在 如果在下一行的循环内我会输入new dict i 并添加一个点 我希望 PyCharm 向我显示可用于
  • 根据给定列表中的值替换列中的值[重复]

    这个问题在这里已经有答案了 我在数据框中有一列 仅允许定义列表中存在的值 例如 给定列表 l1 1 2 5 6 如果列表中不存在列中的值 我需要将每个值替换为 0 column Expected column 1 1 5 5 2 2 3 0
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 如何绘制多类分类器的精度和召回率?

    我正在使用 scikit learn 我想绘制精度和召回曲线 我正在使用的分类器是RandomForestClassifier scikit learn 文档中的所有资源都使用二元分类 另外 我可以绘制多类的 ROC 曲线吗 另外 我只找到
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • Python 中的十进制到二进制半精度 IEEE 754

    我只能使用以下命令将十进制转换为二进制单精度 IEEE754struct pack模块 或者使用相反的方法 float16 或 float32 numpy frombuffer 是否可以使用 Numpy 将十进制转换为二进制半精度浮点数 我
  • 如何可视化多维数据上的 kmeans 聚类

    我在 mnist 数据集上使用 kmeans 聚类算法 并希望可视化聚类后的图 到目前为止我做了这个 from mnist import MNIST mndata MNIST Datasets X train y train mndata
  • 如何保持 python 3 脚本 (Bot) 运行

    不是母语英语 抱歉 英语可能很蹩脚 我也是编程新手 您好 我正在尝试使用 QueryServer 连接到 TeamSpeak 服务器来创建机器人 经过几天的努力 它有效 只有 1 个问题 而我却被这个问题困扰了 如果您需要检查 这是我正在使
  • Pip 突然使用了错误版本的 Python

    在 os x 上使用 pip 时遇到一个奇怪的问题 据我所知 快速查看我的 bash history 似乎可以确认 我最近没有对我的配置进行任何更改 唉 pip 命令似乎突然使用了与以前不同的 python 版本 到目前为止 我使用命令 p
  • Matplotlib 中的 TwoSlopeNorm 未按预期工作

    我正在尝试创建一个具有发散颜色图的绘图 该颜色图在零附近不对称 In this https stackoverflow com a 20146989 6288682例如 DivergingNorm函数被使用并产生我想要的 然而 我使用的是更
  • 通过 ManyToManyField = Value 对 django 查询集进行排序

    如果有一些模型 例如 class Tag models Model name models CharField class Thing models Model title models CharField tags models Many

随机推荐

  • 入门系列之Kubernetes部署

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由林岑影 发表于云 社区专栏 容器实例服务 Container Instance Service CIS 可以帮您在云上快捷 灵活的部署容器 让您专注于构建程序和使用容器而非管理
  • 五分钟带你一步一步去了解Spring Boot是如何实现自动配置

    前言 在使用传统的 Spring 去做 Java EE 应用开发时 在项目中会出现大量的 XMl配置文件 使 Java EE 项目变得笨重且繁琐 从而导致开发和部署上的效率降低 Spring Boot 的出现就是简化 Spring 应用的搭
  • 计算机原码反码补码的理解和作用

    摘要 本文旨在深入探讨整数在计算机中的二进制表示形式以及涉及的源码 反码和补码的运算原理 我们将介绍二进制数的基本概念 解释源码 反码和补码的定义和转换规则 并探讨在运算过程中它们的作用和区别 通过详细的解释和示例 我们希望读者能够全面理解
  • Vue项目引用百度地图并实现搜索定位等功能

    Tip 本篇文章为案例分析 技术点较多 所以篇幅较长 认真阅览的你一定会学到很多知识 前言 百度地图开放平台 给开发者们提供了丰富的地图功能与服务 使我们的项目中可以轻松地实现地图定位 地址搜索 路线导航等功能 本文给大家介绍如何在vue项
  • 继续发布VS2005下DataGridView 的多种样式列控件

    VS2005已经发布好久了 但对DataGridView 的使用 在网上的资料还比较少 DataGridView 无论是美观与功能方面都是DataGrid所不能比的 应该说DataGridView 不是DataGrid的升级 因为DataG
  • 大范围自动化时序软件LiCSBAS安装教程

    1 配置虚拟环境 1 1创建虚拟环境 注意随着版本的提升 python现在是3 9 装不上 需要降python改为3 8版本即可 conda create n licsbas python 3 8 13 1 2 安装LiCSBAS所需要的库
  • 华为ensp模拟校园网/企业网实例(精品拓扑图)

    文章简介 本文用华为ensp对企业网络进行了规划和模拟 也同样适用于校园 医院等场景 如有需要可联系作者 可以根据定制化需求做修改 作者简介 网络工程师 希望能认识更多的小伙伴一起交流 可私信或QQ号 1686231613 目录 摘 要 第
  • 华为发布数字资产继承功能

    在华为开发者大会2023 HDC Together 上 华为常务董事 终端BG CEO 智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能 HarmonyOS提供了安全便捷的数字资产继承路径 在鸿蒙世界中 我们每个人在每台设备 应
  • AI技术进阶的75道面试题

    本文转载自AI科技大本营 整理 AI科技大本营 出品 AI科技大本营 公众号id rgznai100 导语 正值求职 跳槽季 无论你是换工作还是找实习 没有真本事都是万万不行的 可是如何高效率复习呢 之前我们给大家推荐了一份 Python
  • 如何把 Git Submodule 变成普通文件夹

    转载于此文章 记录一下 感觉最重要的是把原来的submodule中的 git删除掉 先删除 Git Submodule 删除所有相关的git配置文件即可 再把 submodule 中的文件添加到主仓库 删除 Git submodule 的命
  • MATLAB求矩阵最大、最小值

    矩阵求最大 最小值用max min函数 max A min A 返回行向量 求每列最大 最小值 max A B min A B 返回一个A B中比较大 较小元素组成的矩阵 max A dim min A dim dim 1 比较A的列 di
  • PowerOJ 2543: 赛场布置

    题目链接 对于每个点 它可以选择男或者女 如果要加上的贡献 那么相邻的一定得是异性才可以 所以 对相邻的 我们可以考虑成 然后 我们对于点坐标的的奇偶性分别讨论即可 当然 还需要考虑的贡献 然后就是全选减去最少割去的即可 include
  • iOS面试题(2.类变量的@protected,@private,@public,@package声明各有什么含义)拓展:常用框架和第三方框架

    2 类变量的 protected private public package声明各有什么含义 private 作用范围只能在自身类 protected 作用范围在自身类和继承自己的子类 默认 public 作用范围最大 可以在任何地方被访
  • nginx匹配以XXX结尾的

    匹配以do结尾的所有文件 如http 192 168 126 168 8080 delivery transportPlanData do startRelease 2019 07 06 endRelease 2019 07 06 sear
  • 初识Composer

    文章目录 依赖管理工具Composer 参考 1 简介 2 安装Composer 3 声明和安装依赖 4 自动加载 5 模块仓库 依赖管理工具Composer 参考 Composer 中文网 Packagist 中国全量镜像官方 地址htt
  • cygwin的git vscode中的使用

    背景 需要用到cygwin 编辑器是vscode 版本 vscode 版本1 55 cygwin版本2 11 2 1 cygcheck c cygwin cygwin的git2 17 cygcheck c git vscode报错 open
  • 算法篇-------贪心2

    文章目录 题目1 活动选择 题目2 无重叠区间 题目3 最多可以参加的会议数目 题目4 去除重复字母 题目5 移掉K位数字 题目6 拼接最大数 题目1 活动选择 有n个需要在同一天使用同一个教室的活动a1 a2 an 教室同一时刻只能由一个
  • linux指令_龙红云

    一 基础指令 1 ls指令 ls 列出当前目录下的所有文件 文件夹的名字 ls root 列出root下的所有文件 文件夹的名字 ls l 以详细列表的形式展示 ls la ls a 显示所有文件 文件夹 包含了隐藏文件 文件夹 ls lh
  • Spring学习总结

    因为是学习总结 所以参考了很多资料做的博客 如果有侵权 请联系我 写的不对的欢迎指出 Spring 开源的轻量级框架 Spring核心 IOC 控制反转控 制反转还有一个名字叫做DI Dependency Injection 中文意思叫依赖
  • Python轻量级Web框架Flask(9)——图书馆项目

    1 项目要求 创建一个项目 用来说明出版社 书籍和作者的关系 作者和书籍之间的关系 1对多 一本书由一个作者完成 一本书可以有多个创作者 出版社和书籍之间的关系 多对多 一个出版社可以出版多本书 一本书可以由多个出版社出版 要求 1 在书籍