Flask入门-搭建图书管理项目
在使用了一段django之后发现django太过于冗余,而简洁的Flask貌似更适合我。
搭建环境
在这里推介大家使用pipenv这个虚拟环境
- 安装pipenv
1
pip install pipenv
建立虚拟环境
1
pipenv install
然后在这个文件夹内会创建2个文件
启动虚拟环境
1
pipenv shell
安装flask
1
pipenv install flask
打开pycharm,把刚刚搭建的虚拟环境配置到其中。
到这里,虚拟环境就已经配置完成啦!
配置数据库
在图管理这个项目中需要用到Mysql这个数据库
导入SQLALchemy扩展
1 | from flask_sqlalchemy import SQLAlchemy |
需要注意的是在使用flask_sqlalchemy的时候可能会有ImportError: No module named MySQLdb
这里有个解决的办法就是到 https://www.lfd.uci.edu/~gohlke/pythonlibs/# 这里下载mysqlclient然后自行安装。
创建db对象,并配置参数
1 | ## 数据库配置:数据库地址/关闭自动跟踪修改 |
创建数据库&添加数据
1 | db.drop_all() |
添加书和作者模型
1 | ##a.模型继承ab.Model |
使用模板显示数据库查询的数据
查询所有的作者信息,让信息传递给模板
1 | authors = Author.query.all() |
模板中按照格式,依次for循环作者和书籍(作者获取书籍,用的是关系引用)
1 | {#先遍历作者,然后在作者里面遍历书籍#} |
使用WTF显示表单
自定义表单类
1 | from flask_wtf import FlaskForm |
模板中显示
1 | <form method="post"> |
消息闪现:secret_key/csrf_token
1 | from flask import flash |
- secret_key的作用
引用一段 Flask Web Development 中的内容:1
2
3SECRET_KEY 配置变量是通用密钥, 可在 Flask 和多个第三方扩展中使用.
如其名所示, 加密的强度取决于变量值的机密度.
不同的程序要使用不同的密钥, 而且要保证其他人不知道你所用的字符串.
SECRET_KEY 的作用主要是提供一个值做各种 HASH, 我没有实际研究过源码, 不同框架和第三方库的功能也不尽相同, 我不能给出准确的答案, 但是主要的作用应该是在其加密过程中作为算法的一个参数(salt 或其他). 所以这个值的复杂度也就影响到了数据传输和存储时的复杂度.
- csrf_token()
简单说来,使用它可以方便我们构建表单和验证表单,具体用法这里不做赘述
详细说明以及用法请到 https://blog.csdn.net/baidu_35085676/article/details/78254954
实现相关的增删逻辑
增加书籍
1 | ''' |
删除书籍
删除书籍— 网页中删除 —点击需要发送书籍的ID—路由需要接受参数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def delete_book(book_id):
# 1.查询数据库,是否有该ID的书,如果有就删除,没有就提示错误
book = Book.query.get(book_id)
# 2.如果有就删除
if book:
try:
db.session.delete(book)
db.session.commit()
except Exception as e:
print(e)
flash('删除书籍出错')
db.SessionExtension.rollback()
else:
# 3.没有提示错误
flash('书籍找不到')
# redirect:重定向,需要传入网络/路由地址
# url_for('index'):需要传入视图函数名,返回该视图函数对应的路由地址
return redirect(url_for('index'))
删除作者
删除作者具体的思路跟删除书籍差不多1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def delete_author(author_id):
# 查询数据库,是否有该ID的作者,如果有就删除(先删书,再删作者),没有就提示错误
# 1.查询数据库
author = Author.query.get(author_id)
# 2.如果有就删除(先删书,再删作者)
if author:
try:
#查询之后直接删除
Book.query.filter_by(author_id=author_id).delete()
#删除作者
db.session.delete(author)
db.session.commit()
except Exception as e:
print(e)
flash('删除作者出错')
db.session.rollback()
else:
flash('作者找不到')
return redirect(url_for('index'))
到这里一个简单的图书管理网站就已经做好啦,完整的项目代码:
https://github.com/dik111/Flask_book_project