Python 简易图书管理系统

## 环境准备

确保你已经安装了 Python 和 Flask。同时,安装 SQLAlchemy 作为 ORM 工具,以及 Flask-Migrate 用于数据库迁移。

```bash

pip install Flask
pip install Flask-SQLAlchemy
pip install Flask-Migrate


```

## Flask 应用结构

我们的 Flask 应用将包含以下几个主要部分:

- `app.py`:这是我们的主要 Flask 应用文件。
- `models.py`:包含我们的数据库模型。
- `views.py`:包含我们的路由和视图函数。
- `forms.py`:包含 WTForms 表单。
- `templates`:一个文件夹,包含 HTML 模板文件。

## 1. 初始化 Flask 应用

在 `app.py` 文件中,我们将初始化 Flask 应用并设置数据库。

```python

from flask import Flask, render_template, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrateapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///library.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)
migrate = Migrate(app, db)from models import Book
from views import *if __name__ == '__main__':app.run(debug=True)


```

## 2. 定义数据库模型

在 `models.py` 文件中,我们将定义图书的模型。

```python

from app import dbclass Book(db.Model):id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)author = db.Column(db.String(100), nullable=False)description = db.Column(db.Text, nullable=True)created_at = db.Column(db.DateTime(), default=db.func.current_timestamp())def __repr__(self):return f'<Book {self.title}>'


```

## 3. 创建表单

在 `forms.py` 文件中,我们将创建用于添加和编辑图书的表单。

```python

from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequiredclass BookForm(FlaskForm):title = StringField('Title', validators=[DataRequired()])author = StringField('Author', validators=[DataRequired()])description = TextAreaField('Description')submit = SubmitField('Save')


```

## 4. 定义视图

在 `views.py` 文件中,我们将定义路由和视图函数。

```python

from flask import render_template, url_for, flash, redirect, request
from app import app, db
from models import Book
from forms import BookForm@app.route('/')
def index():books = Book.query.all()return render_template('index.html', books=books)@app.route('/book/add', methods=['GET', 'POST'])
def add_book():form = BookForm()if form.validate_on_submit():book = Book(title=form.title.data, author=form.author.data, description=form.description.data)db.session.add(book)db.session.commit()flash('Book has been added!')return redirect(url_for('index'))return render_template('add_book.html', form=form)# Additional views for book editing and deletion will be added hereif __name__ == "__main__":app.run(debug=True)


```

## 5. 创建 HTML 模板

在 `templates` 文件夹中,我们将创建 HTML 文件来定义用户界面。例如,`index.html` 用于展示图书列表,`add_book.html` 用于添加新图书的表单。

```html
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Library Management System</title>
</head>
<body><h1>Book List</h1><a href="{{ url_for('add_book') }}">Add a new book</a><ul>{% for book in books %}<li><strong>{{ book.title }}</strong> by {{ book.author }} - {{ book.created_at }}<a href="{{ url_for('edit_book', id=book.id) }}">Edit</a><form action="{{ url_for('delete_book', id=book.id) }}" method="post"><input type="submit" value="Delete"></form></li>{% endfor %}</ul>
</body>
</html>

6. 运行应用

确保所有文件都已正确创建后,运行 app.py 来启动 Flask 应用。

python app.py

访问 http://127.0.0.1:5000/ 来查看你的图书管理系统。

结语

本篇博客提供了一个基本的 Flask 图书管理系统实现。这个系统包括图书的添加、展示、编辑和删除等基本功能。在实际应用中,你可能需要添加用户认证、更复杂的搜索功能、分页显示等。希望这个案例能够帮助你理解 Flask 和 SQLAlchemy 的基本用法,并激发你进一步探索和学习的兴趣。

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

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

相关文章

【深度学习】Diffusion扩散模型的逆扩散问题

1、前言 上一篇&#xff0c;我们讲了Diffusion这个模型的原理推导。但在推导中&#xff0c;仍然遗留了一些问题。本文将解决那些问题 参考论文&#xff1a; ①Variational Diffusion Models (arxiv.org) ②Tutorial on Diffusion Models for Imaging and Vision (arxiv.org…

迭代的难题:敏捷团队每次都有未完成的工作,如何破解?

各位是否遇到过类似的情况&#xff1a;每次迭代结束后&#xff0c;团队都有未完成的任务&#xff0c;很少有完成迭代全部的工作&#xff0c;相反&#xff0c;总是将上期未完成的任务重新挪到本期计划会中&#xff0c;重新规划。敏捷的核心之一是“快速迭代&#xff0c;及时反馈…

ubuntu20.04 ROS 环境下使用速腾80线激光雷达

1.相关系统环境 系统版本:ubuntu 20.04 ROS版本&#xff1a;ROS1 - noetic 激光雷达型号&#xff1a;RoboSense Ruby &#xff08;更新于2024.5.14&#xff09; 2.网口配置&#xff1a; 将PC/工控机的网口配置为&#xff1a; ipv4&#xff0c;方式设置为手动 ip地址、掩码以…

LGadb找不到设备,解决方法:安装驱动

解决方法&#xff1a;安装驱动 https://www.123pan.com/s/Z6tFjv-JqiPv.html提取码:6666

基于springboot实现社区智慧养老监护管理平台系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现社区智慧养老监护管理平台系统演示 摘要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的…

EE-SX670 槽型光电开关 5MM 限位检测感应器 使用案例

EE-SX670是一款槽型光电开关&#xff0c;也被称为U形传感器或限位检测感应器。它是光电传感器中的一种&#xff0c;通过检测物体是否插入其感应槽来触发开关。这种传感器通常用于自动化生产线上的位置检测、对象计数以及安全设备中的运动检测。 EE-SX670作为一款高性能的光电传…

Redis教程(四):Redis中String类型的常用命令

String操作&#xff1a; 插入一个key为name&#xff0c;值为apple的数据 set name apple 插入的数据中如果有空格的数据&#xff0c;请用""双引号&#xff0c;否则会报错&#xff01; set name "hello world!" 如果key为name的数据不存在&#xff0c;…

谷歌外贸seo优化怎么做?

一般有两种选择&#xff0c;在大型电商平台开展业务&#xff0c;如亚马逊&#xff0c;阿里巴巴等平台&#xff0c;也可以选择搭建自己的独立站 选择在大型电商平台可以方便迅速建立起自己的商铺&#xff0c;不需要考虑太多交易&#xff0c;支付&#xff0c;物流等方面的问题&am…

非阻塞模式下的读写操作

实现文件IO的非阻塞模式的读写操作 fcntl函数 功能&#xff1a; #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); // arg表示可变参数&#xff0c;由cmd决定 fcntl()对打开的文件描述符fd执行下面描述的操作之一。操作由cmd决…

MybatisPlus拓展功能(内附全功能代码)

目录 代码生成 静态工具 案例 逻辑删除 枚举处理器 ​编辑 Json处理器 分页插件功能 ​编辑 案例 封装转换方法 代码生成 静态工具 案例 Overridepublic UserVO queryUserAndAddressById(long id) { // 1.查询用户User user getById(id);if (user null || …

mobarxtem应用与华为设备端口绑定技术

交换机端口绑定 华为交换机的基础配置与MOBAXTERM终端连接 实验步骤&#xff1a; 一、给每个交换机划分vlan并添加端口 1.单个vlan的划分 2.批量划分vlan 在高端交换机CE6800上批量划分连续编号的VLAN&#xff0c;本例中连续的vlan20到vlan25 [~CE6800]vlan b 20 to 25 3…

折叠表达式

C11引入了折叠表达式&#xff08;fold expressions&#xff09;&#xff0c;这是一种强大的语言特性&#xff0c;用于在编译时处理参数包中的多个元素。折叠表达式通过使用折叠运算符&#xff08;fold operator&#xff09;来对参数包中的元素执行折叠操作。折叠运算符有三种形…

什么是用户画像?用户画像的作用是什么?

首先我们来说下什么是用户画像&#xff1f; 用户画像是指对目标用户进行详细描述和分类的方法。 它是根据用户的个人特征、行为习惯、兴趣爱好、消费习惯等信息进行分析和总结&#xff0c;以便更好地了解用户需求和行为模式。用户画像可以帮助企业或组织更好地了解他们的目标…

workerman 实现推送实时数据到前端

首先要说明一下,实时推送是有两个socket服务端和两个socket的客户端 我们分别起名叫做 外层服务端 (开启服务主进程 创建一个 websoket 连接)ws:// 内层服务端 (在开户主进程的时候,内部又创建的一个 socket)text:// 外层客户端 (这是由前端的用户端 使用js 创建的一个 w…

论文阅读 - Anatomy of an AI-powered malicious social botnet

论文链接&#xff1a; https://arxiv.org/pdf/2307.16336.pdf 目录 摘要 1引言 2 相关工作 2.1 LLM驱动的网络威胁 2.2 LLM生成的内容检测 2.3 社交机器人检测 2.4 由 LLM 增强的机器人 3 Fox8僵尸网络的识别 4 特性 4.1 配置文件 4.2 社交网络 4.3内容类型 4.4放…

lightdb plorasql存储过程支持SQLCODE和SQLERRM

文章目录 背景用法总结 背景 LightDB PLOraSQL存储过程在执行异常时支持通过sqlcode和sqlerrm拿到错误码和错误信息&#xff0c;这点与Oracle是类似的。但是在Oracle中存储过程未执行异常也能获取到错误码和错误信息&#xff0c;而LightDB会找不到对应的变量。因此计划在24.2版…

性能测试学习二

瓶颈的精准判断 TPS曲线 tps图 响应时间图 拐点在哪里呢? 这是一个阶梯式增加的场景,拐点在第二个压力阶梯上就出现了,因为响应时间增加了,tps增加的却不多,在第三个阶段时,tps增加的就更少了,响应时间也在不断增加,所以性能瓶颈在加剧,越往后越明显【tps的增长,…

Windows下编译RTTR

虽然C11引入了RTTI、Metaprogramming 等技术&#xff0c;但C在Reflection编程方面依旧功能有限。在社区上&#xff0c;RTTR则提供了一套C编写的反射库&#xff0c;补充了C在Reflection方面的缺陷。 零、环境 操作系统Windows 11Visual StudioVisual Studio Community 2022 CMa…

C++ STL概念之 迭代器

什么是迭代器 迭代器&#xff08;Iterator&#xff09;是一个在容器中访问元素的对象&#xff0c;提供了一种方法来顺序访问容器中的元素&#xff0c;而无需暴露容器的底层表示。 或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针&#xff0c;不关注容器底层细…

搭建内网穿透服务(frp)

搭建内网穿透服务(frp&#xff09; 一、为什么 在平时工作当中&#xff0c;我们经常会遇到需要将自己本地的服务暴露在公网上&#xff0c;方便与他人进行接口对接、或者进行演示等等&#xff0c;虽然有一些免费的内网穿透服务&#xff0c;但是大都很不稳定或者带宽太低&#x…