【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】

教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 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.项目目录实现 3.数据库迁移: 1.JWT:json web token 2.jwt工具的封装 4.用户权限校验 5.登录验证装饰器 1.书架列表 2.书架管理 3.最后阅读 2.分类书籍列表 3.热门搜索 7.3小说-详情 2.小说目录 2.阅读偏好 3.阅读设置

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Flask/嘿马文学web完整flask项目/note.md

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

4.分类

  • 分类书本列表
  • 分类列表大类,男生、女生

4.2分类书本列表

  • 在applet_app/category.py文件中实现业务。
1-1 分类书本列表接口设计
  • 接口名称:分类-书本列表-筛选
  • 接口路径:/categoryies/filters
  • 请求方法:GET
  • 请求参数:
参数名称 是否必须 参数类型 参数位置 备注
page True int query 当前页数
pagesize True int query 每页数据大小,默认10条
category_id True int query 分类id
words True int query 字数类型id,0 所有 ,1表示50万字以下,2表示50~100万字,3表示100万字以上
order True int query 排序条件,1表示书籍的热度,2表示书籍的收藏数量
  • 返回数据:

|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 | { "counts": 11, "items": [ ... { "author": "", "categoryID": 1, "categoryName": null, "id": 9, "imgURL": " "introduction": "腹黑总裁..", "state": 1, "title": "腹黑总裁,宠溺娇妻" }, { "author": "", "categoryID": 1, "categoryName": null, "id": 10, "imgURL": " "introduction": "不要再纠缠爱我...", "state": 1, "title": "不要再纠缠爱我" } ], "page": 1, "pages": 2, "pagesize": 10 } |

1-2 分类书本列表的基本业务:
  • 获取参数
  • 根据分类id,查询书籍大分类
  • 根据查询结果,使用关系引用,获取分类信息,使用set存储分类数据
  • 根据分类信息,查询书籍表,获取分类范围内的书籍的查询对象
  • 根据参数words判断查询条件,使用查询对象,进一步按书籍字数进行过滤查询
  • 根据参数order判断查询条件,使用查询对象,按照书籍的热度或是收藏数量排序查询
  • 对查询结果进行分页处理
  • 定义临时列表,遍历查询结果,添加数据
  • 返回结果
1-3 代码实现

1、创建蓝图

|-------------------------------------------------------------------------------|---------------------------------------------------------------------------|
| 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 | from flask import Blueprint category_bp = Blueprint('category', name) |

2、定义视图

|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 | # 定义路由,分类书籍列表 @category_bp.route('/filters') def category_book_list(): # 1.获取参数:page/pagesize/category_id/words/order page = request.args.get('page',1,int) pagesize = request.args.get('pagesize',10,int) category_id = request.args.get('category_id',0,int) # 字数类型说明:0表示所有,1表示50万字以下,2表示50~100万字,3表示100万字以上 words = request.args.get('words',-1,int) # 排序条件说明:1表示按热度,2表示按收藏 order = request.args.get('order',1,int) # 参数判断 if not category_id: return jsonify(msg='缺少分类id'),400 # 2.根据分类条件category_id,查询数据,查询书籍大分类数据 categories = BookBigCategory.query.get(category_id) # 3.判断查询结果,根据大分类数据,使用关系引用,获取二级分类数据 # 使用列表推导式,使用set集合 seconds_id = set([i.cate_id for i in categories.second_cates]) # 4.根据分类数据,查询书籍表,获取分类范围内的书籍数据 # -----过滤查询:保存的是查询结果对象,因为,后续需要对数据进行再次查询的操作 query = Book.query.filter(Book.cate_id.in_(seconds_id)) # 5.根据字数条件words查询书籍数据 # -----1表示50万字以下,2表示50~100万字,3表示100万字以上 if words == 1: query = query.filter(Book.word_count < 500000) elif words == 2: query = query.filter(Book.word_count.between(500000,1000000)) elif words == 3: query = query.filter(Book.word_count > 1000000) # 6.根据排序条件order,按照最热、收藏数量进行排序查询 # -----1表示按热度,2表示按收藏 if order == 1: query = query.order_by(Book.heat.desc()) elif order == 2: query = query.order_by(Book.collect_count.desc()) else: return jsonify(msg='错误的排序选项'),400 # 7.对查询结果进行分页处理,paginate # -----paginate函数表示分页:返回结果为分页的对象 # 第一个参数表示页数,第二个参数表示每页的条目数,第三个参数False表示分页异常不报错 paginate = query.paginate(page,pagesize,False) # items表示获取分页后的数据、page表示当前页数、 # pages表示每页数据条目数total表示分页的总页数 books_list = paginate.items items = [] # 8.遍历分页数据,获取每页数据、总页数 for item in books_list: items.append({ 'id':item.book_id, 'title':item.book_name, 'introduction':item.intro, 'author':item.author_name, 'state':item.status, 'category_id':item.cate_id, 'category_name':item.cate_name, 'imgURL':' }) # 9.转成json,返回数据 data = { 'counts':paginate.total, 'pagesize':pagesize, 'pages':paginate.pages, 'page':paginate.page, 'items':items } return jsonify(data) |

3、使用postman对接口进行测试:

4.分类

  • 分类书本列表
  • 分类列表大类,男生、女生

5.1搜索热门搜索词

  • 在applet_app/search.py文件中实现业务。
1-1 热门搜索词接口设计
  • 接口名称:搜索-热门搜索词
  • 接口路径:/search/tags
  • 请求方法:GET
  • 请求参数:
参数名称 是否必须 参数类型 参数位置 备注
key_word True query 关键词
  • 返回数据:

|-------------------------------------------------------------------------------|-----------------------------------|
| 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 | { 'title':'搜索词', 'isHot':'是否热门' } |

1-2 热门搜索词的基本业务:
  • 获取参数
  • 根据关键词参数,搜索关键词表进行过滤包含关键词查询
  • 返回结果
1-3 代码实现
  • 1.创建蓝图

|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
| 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 | # 导入蓝图 from flask import Blueprint # 创建蓝图对象 search_bp = Blueprint('search',name,url_prefix='/search') |

  • 2.定义视图

|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 | # 定义路由,关键词热门搜索 @search_bp.route("/tags") def tag_list(): # 1.获取参数,用户搜索的关键词key_word key_word = request.args.get("key_word") # 校验参数 if not key_word: return jsonify([]) # 2.根据参数,查询数据库,搜索关键词表进行过滤查询、过滤关键词 # 热门搜索词,默认提供10条数据 search_list = SearchKeyWord.query.filter(SearchKeyWord.keyword.contains(key_word)).limit(10) # 3.返回查询结果 data = [{ 'title':index.keyword, 'isHot':index.is_hot, }for index in search_list] # 转成json返回 return jsonify(data) |

  • 因为数据库search_key_word表里目前没有数据,可以在搜索-精准高匹配推荐功能完成后,再进行功能测试。

5.2搜索书本列表

  • 在applet_app/search.py文件中实现业务。
1-1 搜索书本列表接口设计
  • 接口名称:搜索-书本列表-模糊
  • 接口路径:/search/books
  • 请求方法:GET
  • 请求参数:
参数名称 是否必须 参数类型 参数位置 备注
page True int query 当前页数
pagesize True int query 页大小,默认10条
key_word True string query 关键词
  • 返回数据:

|-------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 | { "counts": 11, "items": [ ... { "author": "", "categoryID": 1, "categoryName": null, "id": 9, "imgURL": " "introduction": "腹黑总裁..", "state": 1, "title": "腹黑总裁,宠溺娇妻" }, { "author": "", "categoryID": 1, "categoryName": null, "id": 10, "imgURL": " "introduction": "不要再纠缠爱我...", "state": 1, "title": "不要再纠缠爱我" } ], "page": 1, "pages": 2, "pagesize": 10 } |

1-2 搜索书本列表的基本业务:
  • 获取参数
  • 判断查询关键词是否存在
  • 如果存在关键词,按照书籍名称进行包含关键词过滤查询
  • 对查询结果进行分页处理
  • 遍历分页结果,添加数据
  • 返回数据
1-3 代码实现

1、创建蓝图

|-------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| 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 | from flask import Blueprint search_bp = Blueprint('search', name,url_prefix='/search') |

2、定义视图

|-------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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 | # 定义路由,搜索书本列表 @search_bp.route('/books') def search_books(): # 1.获取参数,key_word/page/pagesize key_word = request.args.get("key_word") page = request.args.get('page',1,int) pagesize = request.args.get("pagesize",10,int) # 2.检查关键词参数 if not key_word: return jsonify(msg='参数错误'),400 # 3.根据关键词参数,对书籍数据库进行过滤查询,包含 query = Book.query.filter(Book.book_name.contains(key_word)) # 4.判断查询结果 # 5.对查询结果进行分页处理,items/page/pages paginate = query.paginate(page,pagesize,False) # 获取分页后的书本数据 book_list = paginate.items # 6.遍历分页后的数据,获取每本书籍的数据 items = [] for book in book_list: items.append({ 'id':book.book_id, 'title':book.book_name, 'intro':book.intro, 'author':book.author_name, 'state':book.status, 'category_id':book.cate_id, 'category_name':book.cate_name, 'imgURL':' }) # 7.返回结果 data = { 'counts':paginate.total, 'pages':paginate.pages, 'page':paginate.page, 'items':items } return jsonify(data) |

3、使用postman对接口进行测试:

相关推荐
码上淘金3 小时前
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
开发语言·python
Brilliant Nemo3 小时前
四、SpringMVC实战:构建高效表述层框架
开发语言·python
2301_787552874 小时前
console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
人工智能·python·gpt·开源·自动化
懵逼的小黑子4 小时前
Django 项目的 models 目录中,__init__.py 文件的作用
后端·python·django
Y3174294 小时前
Python Day23 学习
python·学习
Ai尚研修-贾莲5 小时前
Python语言在地球科学交叉领域中的应用——从数据可视化到常见数据分析方法的使用【实例操作】
python·信息可视化·数据分析·地球科学
小林学习编程5 小时前
SpringBoot校园失物招领信息平台
java·spring boot·后端
qq_508576096 小时前
if __name__ == ‘__main__‘
python
学地理的小胖砸6 小时前
【Python 基础语法】
开发语言·python
程序员小远6 小时前
自动化测试与功能测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例