基于flask的图书管理-- 蓝图方式
效果图, 只有基本的增删功能
目录
app 应用名
templates 存放模板, html之类的
book 用于区分html文件
index.html 主页展示
view 存放视图
__init__ 初始化蓝图
bookManage.py 视图函数
__init__ 这个是app的类 , 初始化文件
model.py 数据库模型
manage.py 启动
migrations 这个是flask-migrate生成的, 用于迁移数据库
requirements.txt 依赖包
manage.py
启动
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
from app import create_app, db
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
from app.model import User, Book
app = create_app() # 初始化app
manager = Manager(app) # flask_script
migrate = Migrate(app,db) # 用于迁移数据库
def make_shell_context():
return dict(app=app, db=db, User=User)
# 当导入的时候可以直接使用app db, user
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
# 启动的时候需要在控制台中 输入 python xx.py runserver -h地址 -p端口
manager.run()
model.py
数据库模型
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
from app import db
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(30), unique=True)
email = db.Column(db.String(40), unique=True, nullable=True)
# db.relationship() 的第一个参数表明这个关系的另一端是哪个模型
# db.relationship() 中的backref 参数向User 模型中添加一个role 属性
book = db.relationship('Book', backref='user')
# 一对多, 多的关系
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
# 设置多表属性
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
__init__
这个是app的类 , 初始化文件
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
import os
from flask import Flask, url_for
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
basedir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
def create_app():
app = Flask(__name__)
# ----------- 这里可以单独写到配置文件中 开始
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'alflxjklwelropnona'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///{0}'.format(os.path.join(basedir, 'data.sqlite'))
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# ------------ 配置文件 结束
# 初始化数据库
db.init_app(app)
# 图书管理系统
from app.view import book
# 统一对外接口蓝本
app.register_blueprint(book)
return app
# 测试
# app = create_app()
# with app.test_request_context():
# print(url_for('index'))
__init__
这里是view下的init 初始化蓝图
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
from flask import Blueprint
# 生成蓝图
book = Blueprint('book', __name__)
# 导入执行视图
from . import bookManage
bookManage.py
这里是view下的视图函数
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
from app import db
from app.view import book
from app.model import User, Book
from flask import render_template, flash, request, redirect, url_for
@book.route('/', methods=["GET", "POST"])
# 主页展示, 添加
def index():
if request.method == "POST":
author = request.form['author']
book = request.form['book']
# all([])只有当列表里的元素都有值(不为none/0/空字符串)的时候,才会返回true
if not all([author, book]):
flash('不能为空')
return redirect(url_for('book.index'))
getAuther = User.query.filter_by(name=author).first()
if getAuther: # 判断如果存在
user = Book(name=book, user=getAuther)
# db.session.add(add_book)
# db.session.commit()
else: # 如果不存在
user = User(name=author)
book = Book(name=book)
user.book = [book]
db.session.add(user)
db.session.commit()
flash('添加成功')
return redirect(url_for('book.index'))
else:
queryObj = User.query.all()
return render_template('book/index.html', queryObj=queryObj)
# 删除书本
@book.route('/deleteBook/')
def delete(delid):
if Book.query.get(delid) is not None:
# 直接删除并提交
db.session.delete(Book.query.get(delid))
db.session.commit()
return redirect(url_for('book.index'))
# 删除作者
@book.route('/delauth/')
def delauth(delid):
if User.query.get(delid) is not None:
# 获取用户名称
getuser = User.query.filter_by(id=delid).first()
# 循环书本
for user in getuser.book:
# Book.query.filter_by(id=delid).first() = Book.query.get(user.id)
# db.session.delete(Book.query.get(user.id))
db.session.delete(Book.query.filter_by(id=delid).first())
db.session.delete(getuser)
db.session.commit()
return redirect(url_for('book.index'))
return redirect(url_for('book.index'))
index.html
这里是templates\book下的index.html
作者名:
书名:
{% with flash = get_flashed_messages() %}
{% for foo in flash %}
{% if foo %}
{{ foo }}
{% endif %}
{% endfor %}
{% endwith %}
{% for foo in queryObj %}
{% for book in foo.book %}
{% endfor %}
{% endfor %}
requirements.txt
依赖包
alembic==1.0.11
Flask==1.0.3
SQLAlchemy==1.3.5
Flask_Migrate==2.5.2
Flask_Script==2.0.6
Flask_SQLAlchemy==2.4.0
安装就直接 pip -r install requirements.txt
生成以及迁移数据库
# 下面的db 是在 manager.add_command('db', MigrateCommand) 这个中定义的, 可自行修改
# 初始化
python manage.py db init
# 提交修改的字段
python manage.py db migrate -m "add db"
# 生成数据库文件
python manage.py db upgrade
# 最后就能看到 data.sqlite文件了 还有 migrations 后续如果迁移这个文件必不可少