flask 实现简易图书管理
"""
1.配置数据库
a.导入 SQLalchemy库
b.创建db对象,并配置参数
c.创建数据库
2.添加书和作者的模型
a.模型集成db.Model
b.__tablename__ :表名
c.db.Column字段
d.db.relationship 关系引用
3.添加数据
4.使用模板显示数据库查询数据
a.查询所有的作者信息,让信息传递给模板
b.模板中按照格式,依次for循环作者和书籍 (作者获取书记,用的是关系引用)
5.WTF显示表单
a.自定义表单类
b.模板中显示。
c.设置secert_key,encoding,csrf_token
6.实现相关的增删逻辑
b.网页中删除,点击需要发送书籍的ID给删除书籍的路由
-》路由需要接受参数
"""
import sys from flask import Flask, flash, request, redirect, url_for
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired app = Flask(__name__) # 数据库配置,数据库地址/关闭自动跟踪修改
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/books'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'hamish' # reload(sys)
sys.setdefaultencoding = ("UTF8")
db = SQLAlchemy(app) # 创建数据库
# create database books charset =utf8; # 定义书和作者模型
# 作者模型
class Author(db.Model):
# 表名
__tablename__ = 'authors'
# Fileds
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True) # 关系引用
books = db.relationship('Book', backref='author') def __repr__(self):
return 'Author :%s' % self.name # 书籍模型
class Book(db.Model):
__tablename__ = "books" id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey('authors.id')) def __repr__(self):
return 'Books :%s %s' % (self.name, self.author_id) # 自定义表单类
class AuthorForm(FlaskForm):
author = StringField("作者", validators=[DataRequired()])
book = StringField("书籍", validators=[DataRequired()])
submit = SubmitField("提交") # 删除书籍
@app.route("/delete_book/<book_id>")
def delete_book(book_id):
# 如何返回当前网值
# 查询数据库,是否有该ID书,有就删除,没有提示错误 # 重定义
# redirect重定向,需要传入网址/路由地址
# url_for(index):需要传入视图函数名,返回路由地址
book = Book.query.get(book_id)
if book:
# 书籍存在,删除
try:
db.session.delete(book)
db.session.commit()
except Exception as e:
print(e)
flash("删除书籍出错")
db.session.rollback()
else:
flash('书籍找不到!')
return redirect(url_for('index')) @app.route("/", methods=['GET', 'POST'])
def index():
# 创建自定义的表单类
author_form = AuthorForm()
"""
验证逻辑:
1.调用WTF的函数实现验证
2,验证通过获取数据
3,判断作者是否存在
4,如果作者存在,判断书籍是否存在,如果没有重复书籍,添加数据。
如果重复,提示错误。
5,如果作者不存在,就添加作者和书籍。
6.验证不通过提示错误。
"""
# 1.调用WTF的函数实现验证
if author_form.validate_on_submit():
# 2.验证通过获取数据
author_name = author_form.author.data
book_name = author_form.book.data
# 3.判断作者是否存在
author = Author.query.filter_by(name=author_name).first() # 4.如果作者存在
if author:
# 判断书籍是否存在,对书籍做查询操作
book = Book.query.filter_by(name=book_name).first()
# 如果重复就提示错误
if book:
flash("已存在同名书籍")
else:
# 没有重复就添加数据
try:
new_book = Book(name=book_name, author_id=author.id)
db.session.add(new_book)
db.session.commit()
except Exception as e:
print(e)
flash("添加书籍失败")
db.session.rollback()
else:
# 如果作者不存在,添加作者和书籍
try:
new_author = Author(name=author_name)
db.session.add(new_author)
db.session.commit() new_book = Book(name=book_name, author_id=new_author.id)
db.session.add(new_book)
db.session.commit()
except Exception as e:
print(e)
flash("添加作者和书籍失败")
db.session.rollback() else:
if request.method == 'POST':
flash("参数不全") # 查询所有作者信息,传递给模板
authors = Author.query.all()
return render_template("books.html", authors=authors, form=author_form) if __name__ == '__main__':
db.drop_all()
db.create_all() # 生成数据
au1 = Author(name="老王")
au2 = Author(name="老惠")
au3 = Author(name="老刘")
# 把数据交给会话
db.session.add_all([au1, au2, au3]) # 提交会话
db.session.commit()
bk1 = Book(name="老王回忆录", author_id=au1.id)
bk2 = Book(name="我读书少,你别骗我", author_id=au2.id)
bk3 = Book(name="如何才能让自己更强大", author_id=au3.id)
bk4 = Book(name="如何约妹子", author_id=au3.id) # 把数据交给会话
db.session.add_all([bk1, bk2, bk3, bk4])
# 提交会话
db.session.commit()
app.run(debug=True)
使用的第三方模块,flask,pymysql,sqlalchemy
flask 实现简易图书管理的更多相关文章
- 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(3) - 使用Conductor切换页面
前两章中, 我们已经实现了这个图书管理系统的登录窗口, 并实施了完善的单元测试. 该是时候回过头来关注我们的主窗口了. 一个功能丰富的系统一般会有多个页面, 我们图书管理系统虽然是"简易&q ...
- Django学习笔记(11)——开发图书管理页面
一,项目题目: 开发图书管理页面 该项目主要练习Django对多个数据库进行增删改查的操作. 二,项目需求: 基础需求:75% 1. 列出图书列表.出版社列表.作者列表 2. 点击作者,会列出其出版的 ...
- ML基础——搜索引擎与图书管理,百度与李彦宏
本文始发于个人公众号:TechFlow 谈及机器学习,大家想必会有许多联想,比如最近火热的人工智能,再比如战胜李世石的AlphaGo,甚至还会有人联想起骇客帝国或者是机械公敌等经典机器人电影. 但实际 ...
- 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(4) - 图书列表界面
在前三章中我们完成了登录窗口, 并掌握了使用Conductor来切换窗口, 但这些其实都是在为我们的系统打基础. 而本章中我们就要开始开发系统的核心功能, 即图书管理功能了. 通过本章, 我们会接触到 ...
- java图书管理的一个小模块(增删改查,不使用数据库)
图书管理模块:某图书管需要对图书进行信息化管理,要求管理员能够进行新增图书,能按照书名进行模糊查看图书能进行价格统计 系统实现如下:1.新增2.查询3.统计价格 1请输入新书:图书号,书名,作者,价格 ...
- 图书管理之HTML5压缩旋转裁剪图片总结
整体思路 : 在移动端压缩图片并且上传主要用到filereader.canvas 以及 formdata 这三个h5的api.逻辑并不难.整个过程就是: (1)用户使用input file上传图片的 ...
- 【形式化方法:VDM++系列】3.基于VDM++的图书管理系统需求定义
接前文:http://www.cnblogs.com/Kassadin/p/4091040.html 1.Before We Start: 在开始图书管理系统需求定义之前,需要先进行一些说明. 1.1 ...
- vue实现图书管理demo
年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...
- vue.js快速搭建图书管理平台
前 言 上一期简单讲解了vue的基本语法,这一次我们做一个小项目,搭建一个简单的图书管理平台,能够让我们更深刻的理解这门语言的妙用. 1.DEMO样式 首先我们需要搭建一个简单的demo样式 ...
随机推荐
- 面向JVM的应用程序的项目结构
对于Maven所用的项目结构,称为Maven标准的目录结构,不包含git 一.一个典型的源代码结构: / [project-name] README.txt LICENSE.txt pom.xml / ...
- php的优势与缺点
PHP即“超文本预处理器”,是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 PHP 自创的语法.利于学习 ...
- Powershell read XML format config file
upload.xml<?xml version="1.0" ?> <ftpConfig> <Protocol>ftp</Protocol& ...
- nmon内存分析
可参考: MemTotal:显示当前服务器物理内存大小,本服务器有8063180 KB≍7874 MB左右. MemFree:显示当前服务器的空闲内存大小,本服务器有5052336 KB≍4934 M ...
- spring boot 控制 序列化格式
@PostMapping(path = "/register", produces={MediaType.APPLICATION_JSON_VALUE, MediaType.TEX ...
- lLinux 下 Stress 压力测试工具
作者信息 邮箱:sijiayong000@163.com Q Q:601566386 Stress是什么 stress是一个linux下的压力测试工具,专门为那些想要测试自己的系统,完全高负荷和监督这 ...
- LibreOJ 6177 题解(状压DP)
题面 传送门 分析 刚看到这道题时想的是跟最短哈密顿路类似的二进制状压DP,先用floyd处理距离 但是此题用二进制不够,应该用三进制 0,1,2分别表示未送,正在送,已送完 dp[s][i]表示当前 ...
- 16、NumPy ——字节交换
NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.字节顺序,是跨越多字节的程序对象的存储规则. 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地 ...
- 观list.clear()方法 有感
一 . list.clear()底层源码实现 在使用list 结合的时候习惯了 list=null :在创建这样的方式,但是发现使用list的clear 方法很不错,尤其是有大量循环的时候 1.lis ...
- 175-基于TI DSP TMS320C6455、Xilinx V5 FPGA XC5VSX95T的高速数据处理核心板
基于TI DSP TMS320C6455.Xilinx V5 FPGA XC5VSX95T的高速数据处理核心板 一.板卡概述 该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP ...