flask上下文、g变量、current_app

发布时间 2023-10-04 12:21:52作者: 蕝戀

在flask中的上下文分为两种 :

请求上下文 (request context)

也就是和请求相关的上下文,记录一些请求相关的数据。

包含:

1、request请求对象

2、session会话

应用上下文 (app context)

记录一些和flask的应用(app=Flask(name))的上下文数据,

主要包含:

**1、current_app **

在项目其它py文件要使用app时就可以通过current_app来获取(减少循环导入的问题 )

使用方法:

from flask import current_app 

这个变量会返回当前的Flask对象
在项目其它文件要使用app时就可以通过current_app来获取(有助于:减少循环导入的问题 )

**2、g变量 **

使用方法:

from flask import g

这个玩意时flask提供给开发者用于存储数据的一个容器,

**特点:**
     **每次请求g对象中的数据都会被重置。**

**使用场景:**
     在视图函数和请求钩子函数之间传递数据。

开发时应用场景和案例

在视图函数中,所有代码本身就是处于应用上下文和请求上下文的。

如果我们在视图函数外使用时,就会报错:RuntimeError: Working outside of application context.

视图函数外使用应用上下文

with app.app_context():
    print(current_app.url_map)

视图函数外使用请求上下文:(几乎不用....了解即可)

# 同样的,请求上下文也是
# request.args   # RuntimeError: Working outside of request context.
environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'itcast server', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'}  # 模拟解析客户端请求之后的wsgi字典数据
with app.request_context(environ):
    print(request.method)

g变量的使用案例

"""
需求:
  每次请求前校验用户是否登录。(使用请求钩子)
  然后保存用户登录的id,方便调用。(使用g变量存储)
"""

from flask import current_app, g, request, session

# 不管是请求上下文还是应用上下文,他们的使用范围都只能在视图函数内使用!
# 生命周期:请求开始, 返回响应


from flask import Flask

app = Flask(__name__)
app.secret_key="asdadsadjei6546545"

# 注册请求钩子,
@app.before_request
def process_req():
    # 伪代码:请求前先校验是否有权限,如果有保存到g对象中
    # if xxxx:
    # g.username = "小明"
    # else:
    # abort(401)
    session_get = session.get("username")
    if session_get:
        # 将用户信息保存到g变量中
        g.username = session_get


@app.route('/index')
def demo1():
    # 视图函数中可以使用g变量读取出之前存储的值。
    username = g.get("username")
    if username:
        return "欢迎你:%s" % username
    else:
        return "重定向到登录页面!"


@app.route('/login')
def login():
    session["username"] = "小米"
    return "登录成功!"


if __name__ == '__main__':
    app.run(debug=True)

# 测试:
# 先不访问/login,然后直接访问/index,会出现”重定向到登录页面“提示
# 访问/login,然后再访问/index,出现”欢迎你: 小米“