Flask笔记:上下文
线程隔离Thread Local:
如果一个对象具有线程隔离的特性,就可以称之为“Thread Local”,线程隔离是指该对象在不同的线程中都是独立的,在一个线程中对该对象的操作不会影响另一个线程对该对象操作,比如在线程A中修改了该对象的某个属性值,但是在线程B中该对象的这个属性值并没有被修改。
Flask线程隔离对象:
在Flask中,线程隔离对象包括request、session、g、current_app等,在项目中这些对象都可以直接导入使用,而不用担心运行时不同的地方同时使用这些对象时会出问题。比如有多个不同的请求同时进来,它们都会使用到request对象,但因为request是线程隔离的,而每一个请求都有自己的线程,所以request对象使用各自线程的数据。
应用上下文和请求上下文:
应用上下文和请求上下文都有各自的上下文context对象和LocalStack栈对象,在视图函数中使用上下文操作时(current_app对象、url_for函数等),会自动创建对应的上下文context对象并将其push到对应的LocalStack栈的顶端,进行上下文操作时,会自动到这个LocalStack栈的顶端获取context对象。所以在视图函数中是可以直接使用上下文操作的。
如果想要在视图函数外面使用上下文操作,就需要手动创建对应的context对象并将其push到对应的LocalStack栈中。简单示例代码如下:
手动创建应用上下文:
from flask import Flask, current_app app = Flask(__name__) # 第一种方式:在文件中直接创建context对象,并push到LocalStack栈中
app_context = app.app_context()
app_context.push()
# 获取当前app信息的current_app对象属于操作应用上下文的对象
print(current_app) # 第二种方式:在with块中使用应用上下文,这种方式只有在with块中才能进行应用上下文的操作,在with外面就不行了
# 这种方式创建context对象后会自动push到LocalStack栈中
with app.app_context():
print(current_app)
手动创建请求上下文:
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/detail/')
def detail():
return 'detail information!'
# 会先检查应用LocalStack栈顶端有没有应用上下文context对象,如果没有,就会自动创建应用上下文context对象并将其push到应用LocalStack栈顶端
# 然后才创建请求context对象,并将其push到请求LocalStack栈的顶端
# 同样,这种方法只能在with块中才能使用请求上下文操作,在with外面就不行了
with app.test_request_context():
# url_for反转获取视图的url属于请求上下文的操作
print(url_for('detail'))
g对象:
使用“from flask import g”即可使用g对象(可以看做是global的缩写),g对象是一个用来保存全局数据的对象,同时g对象也是线程隔离的。通常我们在整个Flask程序中需要经常使用的一些自定义数据,就可以放在g对象中,需要用的时候在g对象中获取即可。如在一个文件中定义好`g.username = 'xiaoming'`,然后在另一个文件中直接就可以使用`g.username`即可。
Flask笔记:上下文的更多相关文章
- Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)
一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...
- flask 的上下文管理
Flask的上下文对象 Flask有两种Context(上下文),分别是 RequestContext 请求上下文 Request 请求的对象,封装了Http请求(environ)的内容 Sessio ...
- flask笔记(三)Flask 添加登陆验证装饰器报错,及解析
Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...
- Flask的上下文管理机制
前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...
- flask 请求上下文源码(转)
本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...
- Flask笔记1
Flask笔记 首先明确一下,要运行一个动态网页,我们需要 一个 Web 服务器来监听并响应请求,如果请求的是静态文件它就直接将其返回,如果是动态 url 它就将请求转交给 Web 应用. 一个 We ...
- Flask笔记:RESTful
RESTful是用于前台和后端进行通信的一种规范或者说一种风格,采用的是HTTP和HTTPS协议,数据传输的格式使用的都是JSON,而不是XML.通常,RESTful的URL中只有名词,没有动词,而且 ...
- Flask Markup 上下文,request
在模板渲染中,使用Markup转换变量中的特殊字符 from flask import Markup Markup函数对字符串进行转移处理再传递给render_template()函数 在浏览器中显示 ...
- Flask 应用上下文
应用上下文(application context) 它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy ...
随机推荐
- 易优CMS:channel的基础用法
[基础用法] 名称:channel 功能:易优常用标记,可以循环嵌套标签.通常用于网站导航以获取站点栏目信息,方便网站会员分类浏览整站信息 语法: {eyou:channel type='top' r ...
- maven中servlet报错:不识别此servlet问题的解决办法
原因 使用maven集成的tomcat插件的时候,tomcat的lib中,自带servlet-api和jsp. 如果maven中再次导入了这两个jar,会造成jar包冲突现象. 解决办法 我们只是想编 ...
- 基于STM32F429的内存管理
1.内存管理介绍 内存管理,是指软件运行时对计算机内存资源的分配和使用的技术.其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源. 内存管理的实现方法有很多种,他们其实最终都是要 ...
- Python中编写类的各种技巧和方法
简介 有关 Python 内编写类的各种技巧和方法(构建和初始化.重载操作符.类描述.属性访问控制.自定义序列.反射机制.可调用对象.上下文管理.构建描述符对象.Pickling). 你可以把它当作一 ...
- itextsharp操作pdf——插入图片、二维码等
简单介绍 业务需求,需要往pdf图纸上添加二维码功能,将实现过程记录下来 下载类库 直接下载 添加引用 添加命名空间 using System.IO; using iTextSharp.text.pd ...
- JS基础语法----Math对象
推荐查看MDN----在线的帮助文档 实例对象: 通过构造函数创建出来,实例化的对象 静态对象: 不需要创建,直接就是一个对象,方法(静态方法)直接通过这个对象名字调用 实例方法必须通过实例对 ...
- word-break、word-wrap、white-space区别
<div id="box"> Hi , This is a incomprehensibilities long word. </br> 你好 , 这 ...
- Linux下使用 github+hexo 搭建个人博客02-hexo部署到Github Pages
之前的这篇文章<Linux下使用 github+hexo 搭建个人博客01-hexo搭建>,相信大家都知道怎么搭建 hexo ,怎么切换主题,并且完成了一篇博文的创建,以及 MarkDow ...
- MongoDB的模糊查询操作(类关系型数据库的 like 和 not like)
1.作用与语法描述 作用: 正则表达式是使用指定字符串来描述.匹配一系列符合某个句法规则的字符串.许多程序设计语言都支持利用正则表达式进行字符串操作.MongoDB 使用 $regex 操作符来设置匹 ...
- Linux-3.14.12内存管理笔记【伙伴管理算法(1)】
前面分析了memblock算法.内核页表的建立.内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征.而start_kernel()接下来的 ...