在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,出现”欢迎你: 小米“
标签:username,请求,flask,app,current,上下文
From: https://www.cnblogs.com/juelian/p/17742126.html