【Flask开发】嘿马文学web完整flask项目第6篇:设置日志的记录等级,创建日志记录器,指明日志保存的路径、每个日志文件的
教程全知识点简介: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://gitee.com/yinuo112/Backend/blob/master/Flask/嘿马文学web完整flask项目/note.md
6.小说
-
小说-目录
-
小说-阅读
-
小说-详情
6.4推荐-同类热门推荐
- 在applet_app/recommend.py文件中实现业务。
1-1 推荐-同类热门推荐接口设计
- 接口名称:推荐-同类热门推荐
- 接口路径:/recommended/hots/categoryID
- 请求方法:GET
- 请求参数:
参数名称 | 是否必须 | 参数位置 | 备注 |
---|---|---|---|
category_id | True | URL固定参数 | 分类id |
- 返回数据:
[
{
"author": "",
"categoryID": 1,
"categoryName": null,
"id": 3,
"imgURL": "
"introduction": "",
"state": 1,
"title": "嫁入豪门成宠妻"
},
...
]
1-2 推荐-同类热门推荐的基本业务:
- 根据分类id查询数据库书籍大分类表
-
如果存在大分类数据
-
遍历查询结果的大分类数据,使用关系引用,获取二级分类数据
- 查询数据库书籍表,根据书籍分类id,过滤分类书籍数据,取4条
-
遍历查询结果,添加数据
-
否则,查询数据库书籍表,默认返回4条数据。
1-3 代码实现
1、定义recommend蓝图
from flask import Blueprint
bp = Blueprint('recommend', __name__)
2、定义视图
@bp.route('/hots/<int:cate_id>')
def hot_books(cate_id):
"""
推荐-同类热门推荐
推荐返回 4 条
:param cate_id:
:return:
"""
big_cate = BookBigCategory.query.get(cate_id)
books = []
if big_cate:
second_ids = [i.cate_id for i in big_cate.second_cates]
o_books = Book.query.filter(Book.cate_id.in_(second_ids)).limit(4)
for item in o_books:
books.append({
'id': item.book_id,
'title': item.book_name,
'introduction': item.intro,
'author': item.author_name,
'state': item.status,
'categoryID': item.cate_id,
'categoryName': item.cate_name,
'imgURL': ' item.cover)
})
else:
o_books = Book.query.limit(4)
for item in o_books:
books.append({
'id': item.book_id,
'title': item.book_name,
'introduction': item.intro,
'author': item.author_name,
'state': item.status,
'categoryID': item.cate_id,
'categoryName': item.cate_name,
'imgURL': ' item.cover)
})
return jsonify(books)
3、使用postman测试接口:
补充:书架和小说的功能代码实现以后,可以在用户登录代码补充逻辑,默认添加书架书籍的操作。
在user.py文件中,定义函数,在用户登录后,默认调用。
def _add_book_shelf(user_id, sex):
"""书架增加默认书籍"""
books = Book.query.filter(Book.showed == 1).all()
choice_books = random.sample(books, 5)
for book in choice_books:
db.session.add(BookShelf(book_id=book.book_id,
user_id=user_id,
book_name=book.book_name,
cover=book.cover))
db.session.commit()
6.小说
-
小说-目录
-
小说-阅读
-
小说-详情
7.1我的-浏览记录
- 在applet_app/my.py文件中实现业务。
1-1 我的-浏览记录接口设计
- 接口名称:我的-浏览记录
- 接口路径:/my/historys
- 请求方法:GET
- 请求参数:
参数名称 | 是否必须 | 参数类型 | 参数位置 | 备注 |
---|---|---|---|---|
page | True | int | query | 当前页数 |
pagesize | True | int | query | 每页数据量,默认10条 |
- 返回数据:
{
"counts": 0,
"items": [书籍数据],
"page": 1,
"pages": 0,
"pagesize": 10
}
1-2 我的-浏览记录的基本业务
- 获取参数page、pagesize
- 查询数据库浏览记录表,根据用户id过滤查询,并进行分页处理
- 遍历分页数据
- 返回结果
1-3 代码实现
1、定义my蓝图,使用flask-restful扩展视图类
from flask import Blueprint
# 创建蓝图对象
my_bp = Blueprint('my',__name__,url_prefix='/my')
2、定义视图
# 定义蓝图路由
@login_required
@my_bp.route('/histories')
def my_history():
# 1.新建my.py文件,用来实现关于浏览记录的功能代码;
# 2.创建蓝图、定义蓝图、注册蓝图
# 3.导入登录验证装饰器
# 4.获取参数,page和pagesize
page = request.args.get('page',1,int)
pagesize = request.args.get('pagesize',10,int)
# 5.查询数据库浏览记录表,根据用户id查询,分页处理
paginate = BrowseHistory.query.filter_by(user_id=g.user_id).paginate(page,pagesize,False)
# 6.获取分页后的数据
history_data = paginate.items
items = []
for item in history_data:
# 使用关系引用book,从浏览记录表中,获取书籍表里的数据。
items.append({
'id':item.book.book_id,
'title':item.book.book_name,
'author':item.book.author_name,
'status':item.book.status,
'imgURL':'),
'lastTime':item.updated.strftime('%Y-%m-%d %H:%M:%S')
})
# 7.转成json,返回数据
data = {
'counts':paginate.total,
'pagesize':pagesize,
'pages':paginate.pages,
'page':paginate.page,
'items':items
}
return jsonify(data)
3、使用postman测试接口:
1-4 清除浏览记录
- 在applet_app/my.py文件的HistoryResource视图类中,定义http请求方法delete。
# 定义路由,实现浏览记录的删除
@login_required
@my_bp.route('/histories',methods=['DELETE'])
def delete_history():
# 步骤:
# 1.根据用户id、查询浏览记录表
history_data = BrowseHistory.query.filter_by(user_id=g.user_id).all()
# 2.遍历查询结果
for data in history_data:
db.session.delete(data)
# 3.清除数据
db.session.commit()
# 4.返回结果
return jsonify(msg='OK')
pass
7.浏览记录
- 我的-浏览记录
8.1配置-阅读偏好
- 在applet_app/reader_config.py文件中实现业务。
1-1 配置-阅读偏好接口设计
- 接口名称:配置-阅读偏好
- 接口路径:/config/preference
- 请求方法:POST
- 请求参数:
参数名称 | 是否必须 | 参数类型 | 参数位置 | 备注 |
---|---|---|---|---|
Content-Type | True | Headers | application/json | |
gender | True | string | body | 偏好,男1,女0 |
- 返回数据:
{
“msg”:"设置成功"
}
1-2 配置-阅读偏好的基本业务:
- 获取参数gender
- 校验参数
- 提取用户id,查询用户数据
- 保存用户配置,提交数据
- 返回设置结果
1-3 代码实现
1、定义my蓝图,使用flask-restful扩展视图类
from flask import Blueprint
config_bp = Blueprint('config',__name__)
2、定义视图
[invoke 文档]
# 定义路由,用户阅读偏好设置
@login_required
@config_bp.route("/preference",methods=['POST'])
def preference():
# 1.获取参数,post请求体中json数据
gender = request.json.get('gender')
gender = int(gender)
# 2.校验参数,性别的范围
if gender not in [0,1]:
return jsonify(msg='性别参数错误')
# 3.查询数据库,用户表,获取用户信息
# User.query.filter_by(user_id=g.user_id).update({'gender':gender})
# db.session.commit()
user = User.query.filter_by(id=g.user_id).first()
user.gender = gender
# 4.保存数据、提交数据
db.session.add(user)
db.session.commit()
# 5.返回结果
return jsonify(msg='设置成功')
3、使用postman测试接口:
8.2配置-阅读器设置
- 在applet_app/reader_config.py文件中实现业务。
1-1 配置-阅读器设置接口设计
- 接口名称:配置-阅读器设置
- 接口路径:/config/reader
- 请求方法:POST
- 请求参数:
参数名称 | 是否必须 | 参数类型 | 参数位置 | 备注 |
---|---|---|---|---|
Content-Type | True | headers | application/json | |
brightness | True | int | body | 10-100亮度 |
font_size | True | string | body | 字号 |
background | True | string | body | B1 ~ B6 内置背景 |
turn | True | string | body | T1 仿真 T2 平滑 T3 无 翻页模式 |
- 返回数据:
{
"msg": "设置成功"
}
1-2 配置-阅读器设置的基本业务:
- 获取参数brightness、fontSize、background、turn
- 根据用户id查询用户信息
- 保存设置信息,提交数据
- 返回结果
1-3 代码实现
1、定义my蓝图,使用flask-restful扩展视图类
[Psycopg2 文档]
from flask import Blueprint
from flask_restful import Api, Resource, inputs
bp = Blueprint('my', __name__)
api = Api(bp)
2、定义视图 ```python @bp.route('/reader', methods=['POST']) @login_required def reader(): """ 设置阅读器的配置 :return: """ brightness = request.json.get('brightness') fontSize = request.json.get('fontSize') background = request.json.get('background') turn = request.json.get('turn')
user = User.query.get(g.user_id)
if brightness:
user.bright
- 点赞
- 收藏
- 关注作者
评论(0)