【Flask开发】嘿马文学web完整flask项目第6篇:设置日志的记录等级,创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限,6.小说【附代码文档】

80 阅读1分钟

教程全知识点简介: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.阅读设置

👉👉👉   gitee.com/yinuo112/Ba…

6.小说

  • 小说-目录

  • 小说-阅读

  • 小说-详情

6.4推荐-同类热门推荐

  • 在applet_app/recommend.py文件中实现业务。

1-1 推荐-同类热门推荐接口设计

  • 接口名称:推荐-同类热门推荐
  • 接口路径:/recommended/hots/categoryID
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数位置备注
category_idTrueURL固定参数分类id
  • 返回数据:
[
    {
        "author": "",
        "categoryID": 1,
        "categoryName": null,
        "id": 3,
        "imgURL": "http://pu3lpnbqt.bkt.clouddn.com/FmSp0N1hXyavvMoZK3ik65F1otzZ",
        "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': 'http://{}/{}'.format(current_app.config['QINIU_SETTINGS']['host'], 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': 'http://{}/{}'.format(current_app.config['QINIU_SETTINGS']['host'], 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
  • 请求参数:
参数名称是否必须参数类型参数位置备注
pageTrueintquery当前页数
pagesizeTrueintquery每页数据量,默认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':'http://{}/{}'.format(current_app.config['QINIU_SETTINGS']['host'],item.book.cover),
            '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-TypeTrueHeadersapplication/json
genderTruestringbody偏好,男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数据