17、flask-图书简单馆项目

news/2024/11/16 14:26:56/文章来源:https://www.cnblogs.com/littlecc/p/18327810

为了掌握模型可以练一下、以下是代码:

app.py

from App import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)

views.py

from flask import Blueprint, render_template
from datetime import datetime
from .models import *#创建蓝图(路由)
blue = Blueprint('book', __name__)  # 创建蓝图 ,book:蓝图名称,__name__:当前模块名称"""
实现功能:
1、在书籍的 book_index.html中有一个查看全部书籍的超链接按钮,点击进入书籍列表book_list.html页面
2、在书籍的 book_list.html中有一个显示所有书籍名称的按钮,点击书名可以进入书籍详情book_detail.html页面
3、在书籍的 book_detail.html中有一个点击查看书籍的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html页面"""@blue.route('/')# 书籍首页
@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:bookid>')
def book_detail(bookid):book = Book.query.get(bookid)return render_template('book_detail.html', book=book)# 作者详情
@blue.route('/authordetail/<int:authorid>')
def author_detail(authorid):author = Author.query.get(authorid)return render_template('author_detail.html', author=author)# 出版社详情
@blue.route('/publisherdetail/<int:publisherid>')
def publisher_detail(publisherid):publisher = Publisher.query.get(publisherid)return render_template('publisher_detail.html', publisher=publisher)

models.py

from .exts import db    #导入db对象"""
作者 : 书籍 => 1:n  (一本书有一个作者完成,一个作者可以创作多本书)
出本社:书籍  => n:n  (一个出版社可以出版多本书,一本书可以有多个出版社出版)
"""#作者
class Author(db.Model):__tablename__ = 'author'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(50), unique=True)age = db.Column(db.Integer, default=1)sex = db.Column(db.Boolean, default=True)email = db.Column(db.String(200))# 关联关系# backref:反向引用,author:表示在Book表中的外键字段名# 这个book的作用是:当实例化Author对象后、可以使用对象.book.all()获取所有书籍信息或对象.book.title获取书籍标题book = db.relationship('Book', backref='author', lazy='dynamic')# 书籍
class Book(db.Model):__tablename__ = 'book'id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(50), unique=True)##这里注意、数据迁移后、如果手动插入数据,有时会被识别成时间戳、从而导致获取报错:TypeError: fromisoformat: argument must be str# 所以建议手动插入数据时使用sql命令插入()或ORM语句插入# 或者先插入时间戳再使用sql语句修改:UPDATE book SET date = '2021-01-01 12:00:00.000' WHERE id = 3date = db.Column(db.DateTime)# 1对多(作者 - 书籍) ,外键# 通过作者id,关联到作者表author_id = db.Column(db.Integer, db.ForeignKey(Author.id))# 中间表(书籍-出版社)
book_publisher = db.Table('book_publisher',   #表名# 通过书籍id,关联到书籍表db.Column('book_id', db.Integer, db.ForeignKey('book.id'), primary_key=True),   # 外键,# 通过出版社id,关联到出版社表db.Column('publisher_id', db.Integer, db.ForeignKey('publisher.id'), primary_key=True)  # 外键
)# 出版社
class Publisher(db.Model):__tablename__ = 'publisher'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(50), 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(200))# 多对多,关联book表# Book: 表示关联的表(这里是Book类)# backref: 反向引用、publisher:表示在Book表中的外键字段名# lazy:延迟加载# secondary:绑定中间表# 通过关联到书籍Book表,获取书籍信息# # 这个books的作用是:当实例化Author对象后、可以使用对象.book.all()获取所有书籍信息或对象.book.title获取书籍标题books = db.relationship('Book', backref='publishers', secondary=book_publisher, lazy='dynamic')

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate#初始化插件
db = SQLAlchemy()
migrate = Migrate()#和app对象绑定
def init_exts(app):db.init_app(app)migrate.init_app(app,db)

__init__.py

from flask import Flask
from .views import blue
from .exts import init_extsdef create_app():app = Flask(__name__)   # 创建flask应用#注册蓝图app.register_blueprint(blueprint=blue)#配置数据库db_uri = 'sqlite:///sqlite3.db'     #sqlite的配置# db_uri = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask_db?charset=utf8mb4'  #mysql的配置app.config['SQLALCHEMY_DATABASE_URI'] = db_uriapp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False#初始化插件init_exts(app=app)return app

book_index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>书籍首页</title>
</head>
<body><h2>书籍首页</h2><hr><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><hr><ul>{% for book in books %}<li><a href="/bookdetail/{{ book.id }}">{{ book.title }}</a>{# 或使用:url_for('蓝图名.视图函数名', 属性名(自定义)=属性值) #}{# <a href="{{ url_for('book.book_detail', bookid=book.id) }}">{{ book.title }}</a>#}</li>{% endfor %}</ul></body>
</html>

book_detail.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>书籍详情</title>
</head>
<body><h2>书籍详情</h2><hr><p>书籍标题:{{ book.title }}</p><p>书籍出版时间:{{ book.date }}</p><p>作者:<a href="/authordetail/{{ book.author.id }}">{{ book.author.name }}</a></p><p>出版社:{% for publisher in book.publishers %}<a href="/publisherdetail/{{ publisher.id }}">{{ publisher.name }}</a>{% if not loop.last %} | {% endif %}    {# 如果不是最后一个元素,就添加 | #}{% endfor %}</p></body>
</html>

author_detail.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>作者详情</title>
</head>
<body><h2>作者详情</h2><hr><p>作者:{{ author.name }}</p><p>作者年龄:{{ author.age }}</p><p>作者性别:{{ author.sex }}</p><p>作者邮箱:{{ author.email }}</p><p>我的作品:{#  这里通过models.py中作者模型的关联关系的book属性,获取作者的所有作品  #}{% for book in author.book %}<a href="/bookdetail/{{ book.id }}">{{ book.title }}</a>{% if not loop.last %} | {% endif %}    {# 如果不是最后一个元素,就添加 | #}{% endfor %}</p>
</body>
</html>

publisher_detail.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>出版社详情</title>
</head>
<body><h2>出版社详情</h2><hr><p>出版社名称:{{ publisher.name }}</p><p>出版社地址:{{ publisher.address }}</p><p>出版社城市:{{ publisher.city }}</p><p>出版社省份:{{ publisher.province }}</p><p>出版社国家:{{ publisher.country }}</p><p>出版社的网站:{{ publisher.website }}</p><p>出版社的出版书籍:{#  这里通过models.py中出版社模型的关联关系的books属性,获取所有书籍  #}{% for book in publisher.books %}<a href="/bookdetail/{{ book.id }}">{{ book.title }}</a>{% if not loop.last %} | {% endif %}    {# 如果不是最后一个元素,就添加 | #}{% endif %}{% endfor %}</p></body>
</html>

项目目录结构:

效果:

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

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

相关文章

全网最适合入门的面向对象编程教程:25 类和对象的Python实现-Python判断输入数据类型

本文主要介绍了在使用Python面向对象编程时,如何使用type函数、isinstance函数和正则表达式三种方法判断用户输入数据类型,并对相关语法进行介绍。全网最适合入门的面向对象编程教程:25 类和对象的 Python 实现-Python 判断输入数据类型摘要: 本文主要介绍了在使用 Python …

[数据结构] 堆与堆排序

本文介绍了堆这种数据结构的性质,以及堆排序算法,最后介绍了堆的相关应用场景。这篇文章使用 JavaScript 语言进行相关代码的编写。数据结构——堆 heap 基本概念与性质 堆是一颗完全二叉树,根据父子节点之间值的大小关系可以分为:大根堆:每一个节点的值 大于或等于 其子节…

详解 Hough 变换(基本原理与直线检测)

Hough 变换原理与应用前言: 详细介绍了 Hough 变换的基本思想、基本原理和应用等。其中大多都是自己的理解,难免有偏差,仅供参考。文章目录Hough 变换原理与应用1. 基本概述1.1 一些基本问题 1.2 以例子说明1.2.1 例子1:直线 y = k x + b y = kx + by=kx+b​​​​​​​ 到…

致远AnalyticsCloud分析云任意文件读取漏洞复现

产品界面图:FOFA:"AnalyticsCloud分析云"GET请求payload即可读取文件内容paylaod: /.%252e/.%252e/c:/windows/win.ini/a/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252e/.%252…

分形之城 - 题解

分形之城时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB描述 城市的规划在城市建设中是个大问题。 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。 而这座名为 Fractal 的城市设想了这样…

开天辟地,环境安装(cangjie篇)

cangjie,尝鲜日记需求:安装好环境,输出hello world(程序员金字招牌,哈哈~)开整!1 下载SDK 由于官方关闭了开放下载入口,需要走申请、审核机制。然后gitcode平台,下载安装。我们这里就不方便提供下载地址了。目前,我安装的0.53.4b版本。如图:下载步骤就不赘述了,下一…

pycharm远程调试一直卡着(正在收集数据),查看变量时一直显示collecting data并报错Timeout waiting for response且看不到任何内容

1. 问题描述如题,在用PyCharm进行Python代码调试查看具体变量时,会随机遇到一直显示collecting data,到最后报错Timeout waiting for response,在界面中看不到变量内部的内容,如下图所示:2. 解决办法在PyCharm,打开Setting界面,在如下设置项中勾选“Gevent compatible”…

python错题记录:布尔运算与逻辑值检测

一 前言 环境:python 3.10 win10 二 布尔运算与逻辑值检测 1 案例 案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量 案例2如上,之前好长一段时间,上面的布尔运算总是让我感…

霍夫(Hough)直线变换(直线检测)

0 原理霍夫变换在检测各种形状的的技术中非常流行,如果你要检测的形状可以用数学表达式写出,你就可以是使用霍夫变换检测它。及时要检测的形状存在一点破坏或者扭曲也可以使用。我们下面就看看如何使用霍夫变换检测直线。 首先将一条直线用一个点表示,这样用一个点表示直线上…

使用浏览器开发人员工具抓取Windows聚焦桌面壁纸

最近发现Windows聚焦桌面壁纸质量都挺高的,比如下图,无奈图片不给保存。所有只有想办法把他爬下来。没有这个功能的可以在桌面右击鼠标,选择个性化,背景,Windows聚焦这样桌面上就出现一个图标右击这个图标,出现一个弹窗,选择“了解详情”就打开一个网页,我们按F12打开开…

编程语言之泛型困境

困境泛型不可能三角 泛型困境的本质是,关于泛型,你想要缓慢的程序员、缓慢的编译器和臃肿的二进制文件,还是缓慢的执行时间。简单来说就是:要么苦了程序员,要么苦了编绎器,要么降低运行时效率。 不同语言对泛型的考量 以C、C++和Java为例,它们在泛型的设计上有着不同考量…

CMake学习(一)

CMake学习(一) 1、简介CMake是一个强大的软件构建系统,可以用简单的语句来描述所有平台的安装(编译过程) 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档https://cmake.org/2、构建基础项目 最基础的 CMake 项目是由单个源代码文件构建的…