基於flask的圖書管理系統-藍圖

基於flask的圖書管理-- 藍圖方式

效果圖, 只有基本的增刪功能

基於flask的圖書管理系統-藍圖

目錄

基於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'))

基於flask的圖書管理系統-藍圖
基於flask的圖書管理系統-藍圖

__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/<int:delid>')
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/<int:delid>')
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

<h3>圖書管理</h3>

<form method="post">
    <p>作者名: <input type="text" name="author"></p>
    <p>書名: <input type="text" name="book"></p>
    <input type="submit" value="提交  ">
</form>
{% with flash = get_flashed_messages() %}
    {% for foo in flash %}
        {% if foo %}
            <p>{{ foo }}</p>
        {% endif %}
    {% endfor %}
{% endwith %}
<hr>

{% for foo in queryObj %}
    <ul>
        <li>{{ foo.name }} <a href="{{ url_for('book.delauth', delid=foo.id) }}"> 刪除</a></li>
        {% for book in foo.book %}
            <ul>
                <li>{{ book.name }} <a href="{{ url_for('book.delete', delid=book.id)  }}">刪除</a></li>
            </ul>
        {% endfor %}
    </ul>
{% 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 後續如果遷移這個文件必不可少
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章