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添加新的属性,然后每个视图函数都可以使用到给属性)使用情况类似
- g 一般在 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()