g 的介绍


1.Flask 中的 g 的生命周期

  • 当每次请求进来的时候,会为每个请求创建一个 g,当请求结束(即: 当视图函数返回数据给浏览器)的时候 g 就会消失 -> 不懂的可以看回上下文管理中的 app 上下文流程图

2.g 和 全局变量 的区别

  • 全局变量项目启动的时候就会创建,而 g 只会在请求到来的时候创建

  • 在多线程的情况下,g 不会收到影响,因为每个线程下都会有一个g,而在多线程情况下使用全局变量就会出现数据的混乱

3.g 和 session 的区别

  • g只在一次请求周期中存在,当请求结束后g就会消失,而session会在请求到来的时候再去cookie中获取

4.g 的使用场景

  • Flask 中的 g 的使用情况 和 Django 中的(在中间件中对request添加新的属性,然后每个视图函数都可以使用到给属性)使用情况类似 

  • 一般在 before_request after_request 特殊函数上使用

  • 一次http请求内如果先做一个操作,然后再做一个操作,后面的操作需要前面操作的某一个参数的时候,就可以使用g(例如: 使用 g 实现自定义 session)

g 的使用


  • g 的正确使用

# app.py

from flask import Flask, g

app = Flask(__name__)


@app.before_request
def process_request():
g.username = 'Kevin' # 在 g 中添加新的属性


@app.route('/index')
def index():
    username = g.username  # 获取 g 的属性
    print(username)
    return 'index_html'


@app.route('/news')
def news():
    username = g.username  # 获取 g 的属性
    print(username)
    return 'news_html'


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

  • g 的错误使用

    • 当每次请求进来的时候,会为每个请求创建一个 g,当请求结束(即: 当视图函数返回数据给浏览器)的时候 g 就会消失,所以当访问 news 视图获取 g.username 的时候就会报错,因为 index 的视图请求已经结束了 g 也已经消失了,news 视图的 g 不是 index 视图的 g 

# app.py

from flask import Flask, g

app = Flask(__name__)


@app.route('/index')
def index():
    g.username = 'Kevin'  # 在 g 中添加新的属性
    return 'index_html'


@app.route('/news')
def news():
    print(g.username)  # 报错
    return 'news_html'


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