flask上下文、g变量、current_app
在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,出现”欢迎你: 小米“
flask上下文、g变量、current_app的更多相关文章
- Flask上下文管理、session原理和全局g对象
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- 六十九:flask上下文之线程隔离的g对象的使用
保存全局对象的g对象g对象是在整个flask应用运行期间都是可以使用的,并且也是和request一样,是线程隔离的,这个对象是专门用来存放开发者自己定义的一些数据,方便在整个flask程序中都可以使用 ...
- Flask - g变量
传送门 http://flask.pocoo.org/docs/1.0/appcontext/#storing-data http://flask.pocoo.org/docs/1.0/appcont ...
- flask上下文详解
一.前言 了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask如果不了解其中的处理流程,可能在很多问题上不能得到解决,当然我在写本篇文章之前也看到了很 ...
- Flask上下文
Flask的核心机制!关于请求处理流程和上下文 学习一样东西不能只停留在表面,我们要探索其中的细节,学习作者的编程思想,这样才能更进一步. 关于WSGI WSGI(全称Web Server Gatew ...
- flask上下文全局变量,程序上下文、请求上下文、上下文钩子
Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...
- Flask上下文管理
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- Flask上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- Flask上下文源码分析(二)
前面第一篇主要记录了Flask框架,从http请求发起,到返回响应,发生在server和app直接的过程. 里面有说到,Flask框架有设计了两种上下文,即应用上下文和请求上下文 官方文档里是说先理解 ...
- Flask上下文源码分析(一)
flask中的上下文分两种,application context和request context,即应用上下文和请求上下文. 从名字上看,可能会有误解,认为应用上下文是一个应用的全局变量,所有请 ...
随机推荐
- 智能AI 的应用场景
小凡智能AI是一款基于人工智能技术开发的助软件,能够帮助用户解决各种各样的问题,提高工作效率和生活质量.它的应用范围广泛,涵盖了工作.学习.健康等多个方面,为用户提供了全方位的服务支持. 在工作方面, ...
- 原来你是这样的JAVA[04]-数组Arrays
一.打印数组 Arrays类提供了打印数组元素的方法,Arrays.toString()和Arrays.deepToString(). //打印数组 System.out.println(Arrays ...
- pycurl库使用详解
要使用pycurl库 要初始化一个curl对象 c = pycurl.Curl() 设置选项 c.setopt
- YShow性能测试平台搭建
ShowSlow安装 ShowSlow是一个YSlow性能数据收集平台,用于将收集的性能数据 ShowSlow是用php实现的,所以我们需要搭建一台服务器来接收YSlow数据 我搭建的环境是:ubun ...
- 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题
一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...
- Salesforce LWC学习(四十五) lwc支持Console App控制Tab了
本篇参考:https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_workspaceAPI.htm&release= ...
- 11. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 实现健康检查
11. 用Rust手把手编写一个wmproxy(代理,内网穿透等), 实现健康检查 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy gith ...
- Lab3 存储过程与触发器
实验三 存储过程与触发器 实验目的: 学习SQL语言进行编程的基本方法与技术,能够编写存储过程.触发器解决数据库需要处理的复杂问题. 实验内容: 1. 设计一个存储过程或者自定义函数,练习存储 ...
- go defer简介
思考 开始之前,先考虑下下面的代码的执行结果: package main import "fmt" func test() int { i := 0 defer func() { ...
- AI图形算法之一:液位计识别
AI人工智能的主要应用之一就是图形化处理和识别,之前写了两篇,分别是: AI图形算法的应用之一:通过图片模板对比发现油田漏油 AI图形算法的应用之一:仪表识别 经过几个晚上的辛苦,液位计识别也测试成功 ...