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样式 ...
随机推荐
- 应用安全-Web安全-漏洞修复方案整理
通过HTTP头部字段防御措施整理 X-Frame-Options #反劫持 X-XSS-Protection #开启浏览器防XSS功能 Set X-Frame-Options CSP X-Conte ...
- [Bzoj1003][ZJOI2006]物流运输(spfa+dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1003 比较简单的dp,dp[i]为1-i天最小费用,dp方程为dp[i] = min(d ...
- P2324 [SCOI2005]骑士精神(A*)
P2324 [SCOI2005]骑士精神 A*与爆搜的不同就是它有一个估价函数$h(x)$ 这个估价函数一般设为从当前状态到终点状态的估计最短步数,这样可以有效剪枝 但估计值必须严格小于等于实际剩余步 ...
- grep命令用关系或查询多个字符串
bcmsh ps | grep -E 'port|ge2 ' bcmsh ps | grep 'port\|ge2 ' 我的目的是筛选出含有 ‘port’ 或者含有 ‘ge2 ’ 的行,上面的第一行参 ...
- JS高级 —— 普通函数、构造函数、对象方法的调用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- php之ob_start()缓冲区
ob_get_contents()函数及与其相关几个函数的用法 ob_start() ob_get_contents(); 获取缓冲区内容,如果是纯 html内容或标签,则都会放于浏览器的缓冲区中. ...
- 2019-9-2-win10-UWP-MvvmLight入门
title author date CreateTime categories win10 UWP MvvmLight入门 lindexi 2019-09-02 12:57:38 +0800 2018 ...
- squid代理与缓存(上)
squid代理与缓存(上) 1. Squid介绍 1.1 缓存服务器介绍 缓存服务器(英文意思cache server),即用来存储(介质为内存及硬盘)用户访问的网页,图片,文件等等信息的专用服务器. ...
- matplot绘图无法显示中文的问题
手动添加: from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体 mpl.rcParams['axes.un ...
- 《YC创业营:硅谷顶级创业孵化器如何改变世界》:YC2011批量天使投资记录 三星推荐
这个YC创业营是一个硅谷的天使投资基金,每年两次批量投资创业公司.本书说的是2011年YC批量选择了64个创业团队,让他们集中到硅谷办公3个月,给他们创业指导,帮他们找A轮投资. YC创始人偏爱25岁 ...