• Python:Flask使用全局变量g传递数据


    文档

    环境

    $ python --version
    Python 3.7.0
    
    $ pip show flask
    Name: Flask
    Version: 2.0.3
    

    需求:

    全局入口before_request,我们拦截用户请求,对用户权限进行统一校验,校验通过再放行,否则拦截用户。

    将校验通过的当前用户 user_id 存放到全局变量,以便后续处理方法使用,比如获取当前用户的一些信息

    实现:

    1、Flask使用全局变量g 的示例

    # -*- coding: utf-8 -*-
    from flask import Flask, g
    
    app = Flask(__name__)
    
    
    @app.get('/')
    def index():
        return {'user_id': g.user_id}
    
    
    @app.before_request
    def handle_before_request():
        g.user_id = 100
        print('before_request')
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    

    2、改用手动注册的方式进行路由绑定, 也可以获取到全局变量g

    # -*- coding: utf-8 -*-
    from flask import Flask, g
    
    app = Flask(__name__)
    
    
    def index():
        return {'user_id': g.user_id}
    
    
    @app.before_request
    def handle_before_request():
        g.user_id = 100
        print('before_request')
    
    
    # 改用手动注册的方式进行路由绑定
    app.add_url_rule('/', view_func=index)
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    

    3、拆分到单独的函数,也可以获取到全局变量g

    # -*- coding: utf-8 -*-
    from flask import Flask, g
    
    app = Flask(__name__)
    
    
    def index():
        return {'user_id': g.user_id}
    
    
    # 拆分到单独的函数使用 g
    def permission():
        g.user_id = 100
    
    
    @app.before_request
    def handle_before_request():
        permission()
        print('before_request')
    
    
    # 改用手动注册的方式进行路由绑定
    app.add_url_rule('/', view_func=index)
    
    if __name__ == '__main__':
        app.run(debug=True)
    
    

    问题及报错

    1、报错1

    from flask import g
    
    
    g['user_id'] = 1
    
    TypeError: '_AppCtxGlobals' object does not support item assignment
    

    2、报错2

    from flask import g
    
    g.user_id = 1
    
    TypeError: '_AppCtxGlobals' object is not subscriptable
    
  • 相关阅读:
    Redis的发布和订阅
    Ferry工单平台部署
    SQL关键字
    IT行业职场走向,哪些方向更有就业前景?——IT行业的发展现状及趋势探析
    高级同步机制:Phaser与CountDownLatch详解
    rem布局
    想进入游戏建模行业,这4点必须了解
    ChatGPT驱动下,网站AI客服该如何进步和创新
    ANSYS_Q3D仿真激光发射的寄生电感
    springMVC异常处理的知识点+异常处理案例
  • 原文地址:https://blog.csdn.net/mouday/article/details/127101861