【Flask开发】嘿马文学web完整flask项目第7篇:1.项目目录实现,2.数据库的设计【附代码文档】

举报
程序员一诺python 发表于 2025/09/13 12:10:01 2025/09/13
【摘要】 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 配置 启

🏆🏆🏆教程全知识点简介: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测试接口:


🚀✨ (未完待续)项目系列下一章

📚下一篇 将进入更精彩的环节! 🔔 记得收藏 & 关注,第一时间获取更新! 🍅 一起见证整个系列逐步成型的全过程。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。