"""
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 实现简易图书管理的更多相关文章

  1. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(3) - 使用Conductor切换页面

    前两章中, 我们已经实现了这个图书管理系统的登录窗口, 并实施了完善的单元测试. 该是时候回过头来关注我们的主窗口了. 一个功能丰富的系统一般会有多个页面, 我们图书管理系统虽然是"简易&q ...

  2. Django学习笔记(11)——开发图书管理页面

    一,项目题目: 开发图书管理页面 该项目主要练习Django对多个数据库进行增删改查的操作. 二,项目需求: 基础需求:75% 1. 列出图书列表.出版社列表.作者列表 2. 点击作者,会列出其出版的 ...

  3. ML基础——搜索引擎与图书管理,百度与李彦宏

    本文始发于个人公众号:TechFlow 谈及机器学习,大家想必会有许多联想,比如最近火热的人工智能,再比如战胜李世石的AlphaGo,甚至还会有人联想起骇客帝国或者是机械公敌等经典机器人电影. 但实际 ...

  4. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(4) - 图书列表界面

    在前三章中我们完成了登录窗口, 并掌握了使用Conductor来切换窗口, 但这些其实都是在为我们的系统打基础. 而本章中我们就要开始开发系统的核心功能, 即图书管理功能了. 通过本章, 我们会接触到 ...

  5. java图书管理的一个小模块(增删改查,不使用数据库)

    图书管理模块:某图书管需要对图书进行信息化管理,要求管理员能够进行新增图书,能按照书名进行模糊查看图书能进行价格统计 系统实现如下:1.新增2.查询3.统计价格 1请输入新书:图书号,书名,作者,价格 ...

  6. 图书管理之HTML5压缩旋转裁剪图片总结

    整体思路  : 在移动端压缩图片并且上传主要用到filereader.canvas 以及 formdata 这三个h5的api.逻辑并不难.整个过程就是: (1)用户使用input file上传图片的 ...

  7. 【形式化方法:VDM++系列】3.基于VDM++的图书管理系统需求定义

    接前文:http://www.cnblogs.com/Kassadin/p/4091040.html 1.Before We Start: 在开始图书管理系统需求定义之前,需要先进行一些说明. 1.1 ...

  8. vue实现图书管理demo

    年后公司的项目要求用到vue.js知识,我angular没有学,node.js和react也只是了解了一点点,所以学起来比较困难.如果你想学vue.js的知识,推荐网址:http://vuejs.or ...

  9. vue.js快速搭建图书管理平台

      前  言 上一期简单讲解了vue的基本语法,这一次我们做一个小项目,搭建一个简单的图书管理平台,能够让我们更深刻的理解这门语言的妙用.   1.DEMO样式 首先我们需要搭建一个简单的demo样式 ...

随机推荐

  1. (转)Linux下编译安装log4cxx

    Linux下编译安装log4cxx 一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. log4cxx ...

  2. 解决Sql Server服务远程过程调用失败

    方法一:修复Sql Server: 修复过程中若遇到:重新启动计算机失败, 1.按下组合键[Win]+[R],调出运行窗口 2.输入“regedit”,在注册表左侧目录栏中找到如下位置:“HKEY_L ...

  3. SimplePropertyRetriever

    var SimplePropertyRetriever = {     getOwnEnumerables: function (obj) {         return this._getProp ...

  4. 【转载】ROS系统整体架构

    目录 1.从文件系统级理解 2.从计算图级理解 3.从开源社区级理解 由于ROS系统的组织架构比较复杂,简单从一个方面来说明很难说清楚.按照ROS官方的说法,我们可以从3个方面来理解ROS系统整体架构 ...

  5. JavaScript的变量作用域

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. redhat6.5单用户重置root密码

    (1),按 “e” 键进入该界面,继续按 “e” 键进入下一个界面. (2).上下键选中第二个kernel选项,继续按 “e” 键进行编辑. (3).在新的界面里面加一个空格,再输入“1”:或者输入“ ...

  7. linux下创建svn仓库及用户

    1 Linux下创建svn仓库 1.1 启动SVN服务 svnserve -d -r  /SVNRootDirectry 其中SVNRootDirectry是你的SVN 根目录,例如192.85.1. ...

  8. windows安装 阿里云的Fun工具

    由于项目使用到了 函数计算,特此了解到了需要安装 阿里云的Fun工具 Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.日志服务等资源.它通过一个 ...

  9. RESET - 把一个运行时参数值恢复为缺省值

    SYNOPSIS RESET name RESET ALL DESCRIPTION 描述 RESET 将运行时参数恢复为缺省值. RESET 是下面语句的一个变种 SET parameter TO D ...

  10. go语言从例子开始之Example33.工作池

    在这个例子中,我们将看到如何使用 Go 协程和通道实现一个工作池 . Example: package main import "fmt" import "time&qu ...