【Flask开发】嘿马文学web完整flask项目第7篇:1.项目目录实现,2.数据库的设计【附代码文档】
🏆🏆🏆教程全知识点简介:1. 内容 2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 2.用户认证 2.1微某信平台 Json Web Token(JWT) 定义路由,书架管理--添加书籍 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目部署uWSGI 配置 启动 9.部署 10.1异常和日志 10.补充 10.2 flask-restful 1.项目目录实现 2.数据库的设计 3.数据库迁移: 1.JWT:json web token 2.jwt工具的封装 4.用户权限校验 5.登录验证装饰器 1.书架列表 2.书架管理 3.最后阅读 2.分类书籍列表 3.热门搜索 7.3小说-详情 2.小说目录 2.阅读偏好 3.阅读设置
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/458223 中查看
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/457553 中查看
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/458223 中查看
✨ 本教程项目亮点
🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考
🎯🎯🎯全教程总章节

🚀🚀🚀本篇主要内容
1.项目目录实现
- 建议:在单个的脚本文件中,实现基本功能,Flask实现基本程序,基本配置信息数据库、蓝图,然后,把文件进行拆分。
- 1、在pycharm中新建hmwx_backend项目
- 2、在pycharm中选择创建的虚拟环境python解释器
- 3、创建项目启动文件manage.py,实现Flask的基本程序
- 4、在manage.py文件中,实现项目的基本配置,数据库配置、脚本管理器、数据库迁移扩展等
- 5、实现蓝图、工厂函数的封装
- 6、拆分代码,首先拆分配置信息config.py,拆分程序实例app的工厂函数,拆分蓝图对象
- 7、后续根据具体的功能,新创建文件或文件夹
2.数据库的设计
- 根据产品原型进行数据库的设计;
- 数据库中需要存储的数据;
- 表结构
- 字段类型
- 索引设计
-
引擎的选择
-
词性分析法,名词体现表或字段,动词体现关系。
3.数据库迁移:
- 前提:数据库必须先创建。
- 迁移:创建数据库表;需要使用两个扩展包;
- flask-script:脚本管理器
-
flask-migrate:迁移的框架和命令
-
使用步骤:
- 1、生成迁移仓库(文件夹):python manage.py db init
- 2、生成迁移脚本:python manage.py db migrate -m init_tables
- 3、执行迁移脚本:python manage.py db upgrade,执行完成,数据库表创建成功。
[bcrypt 文档]
[aioredis 文档]
1.JWT:json web token
[Psycopg2 文档]
- 概念:字符串;
- 作用:实现状态保持的一种方案,cookie和session;
- JWT token:服务器不保存,
- header:头,存储基本的加密算法。
- payload:载荷,存储业务数据,比如用户id,expire过期时间。
- signature:签名,确保信息不会被修改。
- token = header + payload + signature
2.jwt工具的封装
-
安装pyjwt模块
-
在lib目录下,封装jwt_utils.py封装工具代码
-
``` # jwt工具的封装 # 步骤: # 1.导入jwt模块 # 2.封装jwt生成的函数,必须要有密钥secret_key # 返回token # 3.封装jwt校验的函数 # 返回payload
### 3.用户登录
* 登录接口的实现步骤:
* 1、获取参数code
* 2、获取参数iv、envryptedData
* 3、调用微某信工具,获取session_key
* 4、根据session_key,调用微某信工具,获取用户信息
* 5、判断是否获取到openID
* 6、保存用户数据
* 查询mysql数据库,判断openID是否存在
* 如果openID不存在,保存用户信息
* 否则,更新用户信息
* 7、调用jwt工具,生成token
* 8、返回数据
* 封装工具,生成token的有效期
* 有效期:24小时;
* 当前时间:datetime获取当前时间,时间差操作timedelta
* 总结:
* ```
1、生成当前时间
2、根据时间差,指定token的过期时间,
3、调用jwt工具,传入过期时间
4、返回token
4.用户权限校验
- 需求:在每次请求前,校验用户的身份信息,从token中提取用户id
- 使用请求钩子实现,在每次请求前都会执行,@app.before_request
- g对象:应用上下文对象,在请求过程中可以临时存储数据。
- 实现步骤:
- 1.封装工具,/lib/middlewrares.py
- 2.定义函数,获取用户头信息,Authorization
- 3.从payload中提取用户id,把用户id赋值给g对象
5.登录验证装饰器
- 需求:取出用户信息后,判断用户是否登录,如果登录后,可以进入视图,否则不允许进入视图。
- 实现步骤:
- 1、封装工具,/lib/decoraters.py
- 2、定义装饰器
- 3、判断用户id是否存在,从g对象中尝试获取用户id
- 4、返回结果
[Jinja2 模板文档]
[Flask 部署选项]
[SQLAlchemy 文档]
1.书架列表
- 用户需要登录才能访问,本质是携带token
- 实现步骤:在applet_app/新创建蓝图
- 1.添加登录验证装饰器
- 2.默认查询书架中的所有书籍数据,排序
- 3.判断查询结果
- 如果书架没有书籍,随机挑选5本书籍,存入书架中
- 4.返回书籍数据
2.书架管理
- 添加删除操作的准备工作:
- 用户必须要登录
-
需要参数书籍id
-
添加书架书籍的实现步骤:POST
- 1.添加登录验证装饰器
- 2.接收参数,书籍id
- 3.根据书籍id、用户id,查询书架表,确认数据的存在
- 4.查询书架表,确认该书在书架中是否存在
-
5.如果书架中不存在,添加书籍。
-
删除书架书籍的实现步骤:DELETE
- 1.添加登录验证装饰器
- 2.接收参数,书籍id
- 3.根据书籍id、用户id,查询书架表,确认数据的存在
- 4.删除书籍
3.最后阅读
- 书架中书籍的阅读情况,用户最后阅读的书籍,以及对应的章节。
- 实现步骤:
- 1.使用登录验证装饰器,获取用户信息
- 2.判断用户是否有阅读书籍
- 3.如果用户没有阅读,默认查询第一本书籍,当做用户的阅读书籍
- 4.查询该书籍的章节信息,默认升序排序,
- 把查询结果,存入阅读进度表
- 5.如果用户阅读书籍,查询用户阅读的书籍
- 6.判断是否有阅读进度,如果没有,查询阅读进度表
- 7.返回查询结果
1.分类列表
- 需求:展示书籍分类列表数据,用户分类、书籍分类列表,大分类;
- 实现步骤:
- 1.用户参数,性别参数
- 2.根据性别,查询大分类数据
[tqdm 文档]
- 3.遍历大分类列表数据,保存
- 4.可以通过关系引用,获取大分类下面的二级分类数据
- 5.返回分类数据
2.分类书籍列表
- 接口设计:
请求地址:‘/categories/filters’
请求方法:GET
请求参数:
参数名称 参数类型 是否必须 参数说明
page int True 当前页数
pagesize int True 每页书籍数据的条目数
category_id int True 书籍分类id
words int True 数据字数分类
order int True 排序条件
返回结果:
{
'title':名称,
'author':...
...
}
- 实现步骤:
- 1.获取参数
- 2.根据分类条件category_id,查询数据,查询书籍大分类数据
- 3.判断查询结果,根据大分类数据,使用关系引用,获取二级分类数据
- 4.根据分类数据,查询书籍表,获取分类范围内的书籍数据
- 5.根据字数条件words查询书籍数据
- 6.根据排序条件order,按照最热、收藏数量进行排序查询
- 7.对查询结果进行分页处理,paginate
- 8.遍历分页数据,获取每页数据、总页数
- 9.转成json,返回数据
3.热门搜索
- 保存用户搜索的关键词记录;
- 实现步骤:GET
- 1.获取参数,用户搜索的关键词key_word
- 2.根据参数,查询数据库,搜索关键词表进行过滤查询、过滤关键词
- 3.返回查询结果
1.搜索书本列表
-
接口设计:
-
请求地址:/search/books
- 请求方法:GET
- 请求参数:
参数名称 是否必须 参数类型 参数说明
key_word True string 搜索的关键词
page True int 页数
pagesize True int 每页数据的条目数
-
返回数据:
- 书本列表:
'counts':paginate.total,
'pages':paginate.pages,
[CatBoost 文档]
'page':paginate.page,
'items':items
- 实现步骤:
- 1.获取参数,key_word/page/pagesize
- 2.检查关键词参数
- 3.根据关键词参数,对书籍数据库进行过滤查询,包含
- 4.判断查询结果
- 5.对查询结果进行分页处理,items/page/pages
- 6.遍历分页后的数据,获取每本书籍的数据
- 7.返回结果
2.搜索-精准&高匹配&推荐
-
接口设计:
-
请求地址:'/search/recommends'
- 请求方式:GET
- 请求参数:
参数名 参数类型 是否必须 参数说明
key_word string True 用户搜索关键词
-
返回结果:
- 精准匹配搜索到的数据
- 高匹配搜索到的数据
- 推荐的数据
-
实现步骤:
- 1.获取参数搜索关键词,key_word
- 2.根据关键词,搜索SearchKeyWord表
- 3.判断查询结果,判断关键词是否存在,
- 4.如果不存在,保存关键词
- 5.如果存在关键词,count计数加1,如果count大于10,标记为热门关键词
- 6.定义列表容器,用来存储7条书籍数据;
- 7.精准匹配1条:根据关键词查询书籍表,用书籍名称进行匹配,保存数据;
- 8.高匹配2条:根据书名包含查询关键词,并且,该书不是精确查询的数据,默认提取2条,保存数据;
- 9.推荐4条:根据书籍表过滤查询,不在之前查询到数据范围内的书籍,取出4条作为推荐阅读。
- 返回结果,精准匹配1条、高匹配2条、推荐4条,共7条书籍数据。
7.3小说-详情
- 在applet_app/book.py文件中实现业务。
1-1 小说-详情接口设计
[rich 文档]
- 接口名称:小说-详情
- 接口路径:/book/:id
- 请求方法:GET
- 请求参数:
| 参数名称 | 是否必须 | 参数类型 | 参数位置 | 备注 |
|---|---|---|---|---|
| id | True | int | URL路径参数 | 当前页数 |
| Content-Type | True | application/json | Headers | 参数类型 |
- 返回数据:
{
"author": "",
"categoryID": 1,
"categoryName": null,
"id": 2,
"imgURL": "
"introduction": "这是莫离第一次离家...",
"lastChapter": "第九章 小三登堂入室",
"state": 1,
"title": "偏执狂总裁,暗宠娇妻",
"words": 0
}
[PyJWT 文档]
1-2 小说-详情的基本业务:
- 根据书籍id查询数据库书籍表
- 如果用户登录,查询数据库浏览记录表,判断查询结果,保存浏览记录
- 如果用户未登录,根据书籍id查询数据库书籍章节表,默认按照倒序排序
- 返回结果
1-3 代码实现
1、定义book蓝图
from flask import Blueprint
bp = Blueprint('book', __name__)
[TutorialsPoint Python]
2、定义视图
[Learn Python the Hard Way]
@bp.route('/<int:book_id>')
def detail(book_id):
"""
获取书籍详情
:param book_id:
:return:
"""
book = Book.query.get(book_id)
if not book:
return jsonify({'msg': '书籍不存在'}), 404
# 添加浏览记录
if g.user_id:
bs = BrowseHistory.query.filter_by(user_id=g.user_id,
book_id=book_id).first()
if not bs:
bs = BrowseHistory(user_id=g.user_id,
book_id=book_id)
bs.updated = datetime.now()
db.session.add(bs)
db.session.commit()
chapter = BookChapters.query.filter_by(book_id=book_id) \
.order_by(BookChapters.chapter_id.desc()).first()
# 返回数据
data = {
'id': book.book_id,
'title': book.book_name,
'introduction': book.intro,
'author': book.author_name,
'state': book.status,
'categoryID': book.cate_id,
'categoryName': book.cate_name,
'imgURL': '),
'words': book.word_count,
'lastChapter': chapter.chapter_name if chapter else 'None',
}
return jsonify(data)
[Python 教程]
3、使用postman测试接口:

🚀✨ (未完待续)项目系列下一章
📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。
- 点赞
- 收藏
- 关注作者
评论(0)