当前位置:   article > 正文

Python轻量级Web框架Flask(9)——图书馆项目_python web图书馆代码

python web图书馆代码

1、项目要求:

  • 创建一个项目,用来说明出版社,书籍和作者的关系。
  • 作者和书籍之间的关系:1对多(一本书由一个作者完成,一本书可以有多个创作者)
  • 出版社和书籍之间的关系:多对多(一个出版社可以出版多本书,一本书可以由多个出版社出版)
  • 要求:
    • 1.在书籍的book_index.html中有一个”查看所有书籍“的超链接按钮,点击进入书籍列表book_list.html页表。
    • 2.在书籍的book_list.html中显示所有书名,点击书名可以进入书籍详情book_detail.html。
    • 3.在书籍book_detail.html中可以点击该书的作者和出版社,进入作者详情的author_detail.html和出版社详情publisher_detail.html页面。

2、项目模板:


3、第一步:在models中写好表结构:

# models.py : 模型,数据库

'''
    模型      ===      数据库
    类        ——>     表结构
    类属性     ——>    表字段
    一个对象   ——>    表的一行数据
'''


from .exts import db

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型

# 作者
class Author(db.Model):
    __tablename__ = 'author'  # 表名,如果不写表名,也会自动生成(类名小写),表名一定要小写!
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))
    age = db.Column(db.Integer, default=1)
    sex = db.Column(db.Boolean, default=True)   # True表示男
    email = db.Column(db.String(200))
    # 关系:Author可以调用books,Book可以反向调用my_auther
    books = db.relationship('Book', backref='my_auther', lazy='dynamic')
# 中间表(书籍-出版社)
book_publish = db.Table(
    'book_publisher',
    db.Column('book_id', db.Integer, db.ForeignKey('book.id'), primary_key=True),
    db.Column('publisher_id', db.Integer, db.ForeignKey('publisher.id'), primary_key=True)
)
# 书籍
class Book(db.Model):
    __tablename__ = 'book'  # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(100), unique=True)
    date = db.Column(db.DateTime)   # 书籍日期
    # 1对多:外键
    author_id = db.Column(db.Integer, db.ForeignKey(Author.id))
# 出版社
class Publisher(db.Model):
    __tablename__ = 'publisher'  # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    address = db.Column(db.String(200))
    city = db.Column(db.String(100))
    province = db.Column(db.String(100))
    country = db.Column(db.String(100))
    website = db.Column(db.String(100))
    # 多对多,关联book表,secondary是设置中间表
    books = db.relationship('Book', backref='publishers', secondary=book_publish, lazy='dynamic')

  • 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
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

4、第二步:进行数据迁移

  • 1、在pycharm中将项目_05_TuShuGuanXiangMu拖到终端中(改变终端路径)
  • 2、在终端执行:flask db init 数据库初始化
  • 3、在终端执行:flask db migrate
  • 4、在终端执行:flask db upgrade
  • 最终执行结束会生成migrations文件夹

5、第三步:创建书籍相关页面:

在这里插入图片描述


6、第四步:给数据库添加测试数据:以作者数据库为例说明

在这里插入图片描述
总结:添加数据可以在pycharm专业版自带的数据库中操作如上,也可以在workbench中操作(一种界面操作,一种SQL语句操作)。


注意:本项目第五步和第六步是同步测试编写的

7、第五步:其余python代码展示

app

from App import creat_app

app = creat_app()


if __name__ == '__main__':
    app.run(debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

__init __

# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts

def creat_app():
    app = Flask(__name__)

    # 注册蓝图
    app.register_blueprint(blueprint=blue)

    # 配置数据库
    # db_uri = 'sqlite:///sqlite3.db'
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/bookdb' # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改

    # 初始化插件
    init_exts(app=app)

    return app

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

exts

from flask_sqlalchemy import SQLAlchemy # ORM(对象关系映射)
from flask_migrate import Migrate   # 数据迁移

db = SQLAlchemy()
migrate = Migrate()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app,db=db)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

views

# 在views.py中放路由和视图函数

from flask import Blueprint, request, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('book', __name__)

@blue.route('/')
@blue.route('/bookindex/')
def book_index():
    return render_template('book_index.html')

@blue.route('/booklist/')
def book_list():
    books = Book.query.all()
    return render_template('book_list.html', books=books)

@blue.route('/bookdetail/<int:bid>/')   # 路由传参
def book_detail(bid):
    book = Book.query.get(bid)
    return render_template('book_detail.html', book=book)

# 作者详情
@blue.route('/authordetail/<int:aid>/')   # 路由传参
def author_detail(aid):
    author = Author.query.get(aid)
    return render_template('author_detail.html', author=author)

# 出版社详情
@blue.route('/publisherdetail/<int:pid>/')   # 路由传参
def publisher_detail(pid):
    publisher = Publisher.query.get(pid)
    return render_template('publisher_detail.html', publisher=publisher)
  • 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
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

8、第六步:templates中所有页面代码展示

author_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>作者详情</title>
</head>
<body>
    <h2>作者详情</h2>
    <p>作者姓名:{{ author.name }}</p>
    <p>作者年龄:{{ author.age }}</p>
    <p>作者性别:{{ author.sex }}</p>
    <p>作者Email:{{ author.email }}</p>
    <hr>
    <h3>作者作品集合:</h3>
    <p>
        {% for book in author.books %}
            <a href="/bookdetail/{{ book.id }}/">《{{ book.title }}》</a>
            {% if not loop.last %}|{% endif %}
        {% endfor %}

    </p>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

book_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍详情</title>
</head>
<body>
    <h2>《{{ book.title }}》</h2>
    <p>书籍出版时间:{{ book.date }}</p>
    <p>作者:
        <a href="/authordetail/{{ book.my_author.id }}/">{{ book.my_author.name }}</a>
    </p>
    <p>出版社:
        {% for publisher in book.publishers %}
            <a href="/publisherdetail/{{ publisher.id }}/">{{ publisher.name }}</a> |
        {% endfor %}
    </p>

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

book_index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍首页</title>
</head>
<body>
    <h2>书籍首页</h2>
    <a href="/booklist/">查看所有书籍</a>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

book_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍列表</title>
</head>
<body>
    <h2>书籍列表</h2>
    <ul>
        {% for book in books %}
            <li>
                <a href="/bookdetail/{{ book.id }}/">{{ book.title }}</a>
            </li>
        {% endfor %}
    </ul>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

publisher_detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>出版社详情</title>
</head>
<body>
    <h2>出版社详情</h2>
    <p>出版社名称:{{ publisher.name }}</p>
    <p>出版社地址/城市/省份/国家:{{ publisher.address }}/{{ publisher.city }}/{{ publisher.province }}/{{ publisher.conuntry }}</p>
    <p>出版社网址:{{ publisher.website }}</p>
    <hr>
    <p>出版社出版过的书籍:
        {% for book in publisher.books %}
            <a href="/bookdetail/{{ book.id }}/">《{{ book.title }}》</a>
            {% if not loop.last %}|{% endif %}
        {% endfor %}
    </p>

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

总结:

  • 完成该项目的前提是对Flask模型有足够的认识。
  • 可以看出在Flask模型中,models中主要是进行建立表结构的操作(一对多,多对多)。
  • 在Flask模型中,views主要是进行页面调用和数据库表的增删改查。
  • 在Flask模型中,exts主要就是放插件和拓展。
  • 在Flask模型中,init主要就是初始化。
  • 在Flask模型中,app就是主程序,整个程序从这里启动。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/809618
推荐阅读
相关标签
  

闽ICP备14008679号