17、flask-图书简单馆项目
为了掌握模型可以练一下、以下是代码:
app.py
from App import create_app app = create_app() if __name__ == '__main__': app.run(debug=True)
views.py
from flask import Blueprint, render_template from datetime import datetime from .models import * #创建蓝图(路由) blue = Blueprint('book', __name__) # 创建蓝图 ,book:蓝图名称,__name__:当前模块名称 """ 实现功能: 1、在书籍的 book_index.html中有一个查看全部书籍的超链接按钮,点击进入书籍列表book_list.html页面 2、在书籍的 book_list.html中有一个显示所有书籍名称的按钮,点击书名可以进入书籍详情book_detail.html页面 3、在书籍的 book_detail.html中有一个点击查看书籍的作者和出版社,进入作者详情的author_detail.html和出版社详情的publisher_detail.html页面 """ @blue.route('/') # 书籍首页 @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:bookid>') def book_detail(bookid): book = Book.query.get(bookid) return render_template('book_detail.html', book=book) # 作者详情 @blue.route('/authordetail/<int:authorid>') def author_detail(authorid): author = Author.query.get(authorid) return render_template('author_detail.html', author=author) # 出版社详情 @blue.route('/publisherdetail/<int:publisherid>') def publisher_detail(publisherid): publisher = Publisher.query.get(publisherid) return render_template('publisher_detail.html', publisher=publisher)
models.py
from .exts import db #导入db对象 """ 作者 : 书籍 => 1:n (一本书有一个作者完成,一个作者可以创作多本书) 出本社:书籍 => n:n (一个出版社可以出版多本书,一本书可以有多个出版社出版) """ #作者 class Author(db.Model): __tablename__ = 'author' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50), unique=True) age = db.Column(db.Integer, default=1) sex = db.Column(db.Boolean, default=True) email = db.Column(db.String(200)) # 关联关系 # backref:反向引用,author:表示在Book表中的外键字段名 # 这个book的作用是:当实例化Author对象后、可以使用对象.book.all()获取所有书籍信息或对象.book.title获取书籍标题 book = db.relationship('Book', backref='author', lazy='dynamic') # 书籍 class Book(db.Model): __tablename__ = 'book' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(50), unique=True) ##这里注意、数据迁移后、如果手动插入数据,有时会被识别成时间戳、从而导致获取报错:TypeError: fromisoformat: argument must be str # 所以建议手动插入数据时使用sql命令插入()或ORM语句插入 # 或者先插入时间戳再使用sql语句修改:UPDATE book SET date = '2021-01-01 12:00:00.000' WHERE id = 3 date = db.Column(db.DateTime) # 1对多(作者 - 书籍) ,外键 # 通过作者id,关联到作者表 author_id = db.Column(db.Integer, db.ForeignKey(Author.id)) # 中间表(书籍-出版社) book_publisher = db.Table( 'book_publisher', #表名 # 通过书籍id,关联到书籍表 db.Column('book_id', db.Integer, db.ForeignKey('book.id'), primary_key=True), # 外键, # 通过出版社id,关联到出版社表 db.Column('publisher_id', db.Integer, db.ForeignKey('publisher.id'), primary_key=True) # 外键 ) # 出版社 class Publisher(db.Model): __tablename__ = 'publisher' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50), 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(200)) # 多对多,关联book表 # Book: 表示关联的表(这里是Book类) # backref: 反向引用、publisher:表示在Book表中的外键字段名 # lazy:延迟加载 # secondary:绑定中间表 # 通过关联到书籍Book表,获取书籍信息 # # 这个books的作用是:当实例化Author对象后、可以使用对象.book.all()获取所有书籍信息或对象.book.title获取书籍标题 books = db.relationship('Book', backref='publishers', secondary=book_publisher, lazy='dynamic')
exts.py
from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate #初始化插件 db = SQLAlchemy() migrate = Migrate() #和app对象绑定 def init_exts(app): db.init_app(app) migrate.init_app(app,db)
__init__.py
from flask import Flask from .views import blue from .exts import init_exts def create_app(): app = Flask(__name__) # 创建flask应用 #注册蓝图 app.register_blueprint(blueprint=blue) #配置数据库 db_uri = 'sqlite:///sqlite3.db' #sqlite的配置 # db_uri = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask_db?charset=utf8mb4' #mysql的配置 app.config['SQLALCHEMY_DATABASE_URI'] = db_uri app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #初始化插件 init_exts(app=app) return app
book_index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>书籍首页</title> </head> <body> <h2>书籍首页</h2> <hr> <a href="/booklist/">查看所有书籍</a> </body> </html>
book_list.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>书籍列表</title> </head> <body> <h2>书籍列表</h2> <hr> <ul> {% for book in books %} <li> <a href="/bookdetail/{{ book.id }}">{{ book.title }}</a> {# 或使用:url_for('蓝图名.视图函数名', 属性名(自定义)=属性值) #} {# <a href="{{ url_for('book.book_detail', bookid=book.id) }}">{{ book.title }}</a>#} </li> {% endfor %} </ul> </body> </html>
book_detail.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>书籍详情</title> </head> <body> <h2>书籍详情</h2> <hr> <p>书籍标题:{{ book.title }}</p> <p>书籍出版时间:{{ book.date }}</p> <p>作者: <a href="/authordetail/{{ book.author.id }}">{{ book.author.name }}</a> </p> <p>出版社: {% for publisher in book.publishers %} <a href="/publisherdetail/{{ publisher.id }}">{{ publisher.name }}</a> {% if not loop.last %} | {% endif %} {# 如果不是最后一个元素,就添加 | #} {% endfor %} </p> </body> </html>
author_detail.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>作者详情</title> </head> <body> <h2>作者详情</h2> <hr> <p> 作者:{{ author.name }} </p> <p>作者年龄:{{ author.age }}</p> <p>作者性别:{{ author.sex }}</p> <p>作者邮箱:{{ author.email }}</p> <p>我的作品: {# 这里通过models.py中作者模型的关联关系的book属性,获取作者的所有作品 #} {% for book in author.book %} <a href="/bookdetail/{{ book.id }}">{{ book.title }}</a> {% if not loop.last %} | {% endif %} {# 如果不是最后一个元素,就添加 | #} {% endfor %} </p> </body> </html>
publisher_detail.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>出版社详情</title> </head> <body> <h2>出版社详情</h2> <hr> <p>出版社名称:{{ publisher.name }}</p> <p>出版社地址:{{ publisher.address }}</p> <p>出版社城市:{{ publisher.city }}</p> <p>出版社省份:{{ publisher.province }}</p> <p>出版社国家:{{ publisher.country }}</p> <p>出版社的网站:{{ publisher.website }}</p> <p>出版社的出版书籍: {# 这里通过models.py中出版社模型的关联关系的books属性,获取所有书籍 #} {% for book in publisher.books %} <a href="/bookdetail/{{ book.id }}">{{ book.title }}</a> {% if not loop.last %} | {% endif %} {# 如果不是最后一个元素,就添加 | #} {% endif %} {% endfor %} </p> </body> </html>
项目目录结构:
效果:
本文作者:littlecc
本文链接:https://www.cnblogs.com/littlecc/p/18327810
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步