线程隔离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笔记:上下文的更多相关文章

  1. Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)

    一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...

  2. flask 的上下文管理

    Flask的上下文对象 Flask有两种Context(上下文),分别是 RequestContext 请求上下文 Request 请求的对象,封装了Http请求(environ)的内容 Sessio ...

  3. flask笔记(三)Flask 添加登陆验证装饰器报错,及解析

    Flask 添加登陆验证装饰器报错,及解析 写这个之前,是想到一个需求,这个是关于之前写Flask笔记(二)中的一个知识点,路由相关 需求为 : 有一些页面必须是登陆之后才能访问的,比如Shoppin ...

  4. Flask的上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

  5. flask 请求上下文源码(转)

    本篇阅读目录 一.flask请求上下文源码解读 二.http聊天室(单聊/群聊)- 基于gevent-websocket 回到顶部 转:https://www.cnblogs.com/li-li/p/ ...

  6. Flask笔记1

    Flask笔记 首先明确一下,要运行一个动态网页,我们需要 一个 Web 服务器来监听并响应请求,如果请求的是静态文件它就直接将其返回,如果是动态 url 它就将请求转交给 Web 应用. 一个 We ...

  7. Flask笔记:RESTful

    RESTful是用于前台和后端进行通信的一种规范或者说一种风格,采用的是HTTP和HTTPS协议,数据传输的格式使用的都是JSON,而不是XML.通常,RESTful的URL中只有名词,没有动词,而且 ...

  8. Flask Markup 上下文,request

    在模板渲染中,使用Markup转换变量中的特殊字符 from flask import Markup Markup函数对字符串进行转移处理再传递给render_template()函数 在浏览器中显示 ...

  9. Flask 应用上下文

    应用上下文(application context) 它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy ...

随机推荐

  1. Jrebel实现tomcat热部署,遇到的问题以及解决办法,详解

    我的安装的详细过程: 下载Jrebel:  https://github.com/ilanyu/ReverseProxy/releases/tag/v1.4 我的是winx64,所以选择如下的: 下载 ...

  2. navicat的一些常用快捷键

    Navicat可以支持连接多种数据库,使用上的功能也比较强大. 如果使用了IDEA内置的数据库工具(个人喜欢用这个)或是SQL Server官方的数据库管理工具的话,会发现使用上都存在区别,区别就主要 ...

  3. oracle相邻表记录交换(单双两两交换)

    在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...

  4. Docker Compose file

    1.  Service configuration Compose file 是一个YAML文件,用于定义 services, networks, 和 volumes.其默认路径是./docker-c ...

  5. Selenium(十二):操作Cookie、调用JavaScript、HTML5的视频播放

    1. 操作Cookie 有时候我们想要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试的.WebDriver提供了操作Cookie的相关方法,可以读取.添加和删 ...

  6. R Data Frame

    https://www.datamentor.io/r-programming/data-frame/ Check if a variable is a data frame or not We ca ...

  7. Saltstack_实战指南01_系统规划

    1. 实战项目GitHub地址 之前<Saltstack_使用指南>详细讲解了saltstack的使用.那么从这节开始实战讲解,当然不会再像之前那样详细说明了.只是讲一些系统规划之类的信息 ...

  8. [20191112]oracle共享连接模式端口.txt

    [20191112]oracle共享连接模式端口.txt --//如果使用共享服务模式,你可以发现每次重启数据库对应的端口号会发生变化.# netstat -tunlp | egrep "A ...

  9. Ovirt 简单配置

    Ovirt是一款开源的虚拟化平台管理 主要组成: 1.OvirtEngine Server 用于管理和分配资源 ,能通过web管理 2.Hosts 提供虚拟化功能,提供CPU资源和内存资源,用于分配给 ...

  10. GAN网络原理介绍和代码

    GAN网络的整体公式: 公式各参数介绍如下: X是真实地图片,而对应的标签是1. G(Z)是通过给定的噪声Z,生成图片(实际上是通过给定的Z生成一个tensor),对应的标签是0. D是一个二分类网络 ...