Flask自定义装饰和g的使用

1. 在commons.py文件中新增一个装饰器类: 注:一定要加入@wraps进行装饰否则,装饰器在给多个函数进行装饰时会报错
python 复制代码
from functools import wraps
from flask import session, current_app, g



# 定义登陆装饰器,封装用户的登陆数据
def user_login_data(view_func):
    @wraps(view_func)
    def wrapper(*args, **kwargs):
        # 1,从sess1on中取出用户的user1d
        user_id = session.get("user_id")
        # 2通过user1d取出用户对象
        user = None
        if user_id:
            try:
                from info.models import User
                user = User.query.get(user_id)
            except Exception as e:
                current_app.logger.error(e)
        # 3.将u5er数据封装到g对象
        g.user = user
        return view_func(*args, **kwargs)

    return wrapper
2.装饰器的使用
python 复制代码
from flask import current_app, jsonify, render_template, abort, session, g
from . import news_blue
from info import models
from info.utils.response_code import RET
from ...utils.commons import user_login_data


@news_blue.route('/<int:news_id>')
##########自定义装饰器#######################
@user_login_data
def news_detail(news_id):
    try:
        ############################原本的这里的功能被装饰器取代了#############
        # # 0,从session中获取到user_id,并根据user_id获取到用户信息
        # user_id = session.get('user_id')
        # user = models.User.query.get(user_id)
        # 1,根据新闻编号,查询新闻对象
        try:
            news = models.News.query.get(news_id)
        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg="获取新闻失败")
        # 2. 如果新闻对象不存在直接抛出异常
        if not news:
            abort(404)
        # 获取前6条热点新闻
        click_news = models.News.query.order_by(models.News.clicks.desc()).limit(6)
        click_news_list = []
        for item in click_news:
            click_news_list.append(item.to_dict())
        # 2.携带数据,渲染页面
        data = {
            "news_info": news.to_dict(),
        #########这里的user直接从g中取出,如果使用装饰包裹时g中是没有user的#########
            "user_info": g.user.to_dict() if g.user else '',
            "news": click_news_list
        }
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.UNKOWNERR, errmsg='未知错误!')
    return render_template("news/detail.html", data=data)
相关推荐
兵慌码乱20 分钟前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
IT_陈寒1 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
fliter2 小时前
最后一块拼图:用 bitvec 构造 IPv4 包,真正做出自己的 Ping
后端
luckdewei3 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
fliter3 小时前
用 Rust 解析并生成 ICMP 包:checksum、nom 与 cookie-factory
后端
蝎子莱莱爱打怪3 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
fliter3 小时前
从 panic 到 Result:用 Rust 重新整理一个 ping 项目的错误处理
后端
森蓝情丶4 小时前
我给 AI 搭了个法庭:一个前端仔的 LangGraph 实战全记录
前端·后端
JensCS猿4 小时前
从 Spring Boot 回看 SSM 框架:手动挡与自动挡的驾驶哲学
后端
爱勇宝4 小时前
干了近 8 年,一夜之间被裁:AI 时代,程序员最该害怕的不是 AI
前端·后端·程序员