线程隔离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. 转载-Archunit的使用

    Archunit的使用 注:开发的编辑器: Intellij Idea,JDK版本是JDK8     Archunit是什么,官网的英文介绍很好,建议阅读原文,"ArchUnit is a  ...

  2. Redis入门(三)-Redis的安装及操作key的命令介绍

    前两节对Redis做了一些详细的介绍,那么接下来开始我们就正式进入Redis的学习阶段. 安装Redis Windows下安装redis非常方便, 下载压缩包解压即可使用. 链接:https://pa ...

  3. Java描述设计模式(13):迭代器模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.迭代器模式 1.基础概念 迭代器模式又叫游标模式,是对象的行为模式.迭代器模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象. 2 ...

  4. Java 添加Word脚注、尾注

    Word中的脚注和尾注都是对文本的补充说明.脚注一般是附在书页最左下端的注文,用以解释.说明特定内容:而尾注则是位于文档末尾,用于列出引文的出处.脚注和尾注都可以是针对某些文字或者段落来添加.本文中, ...

  5. 3D开发基础知识和简单示例

    引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...

  6. Python 變量 Variable 動態綁定

    為何 Python 變量沒有 Data Type 概念 ? 可以與任意 Data Type 綁定? Python 變量 Variable 與其他程式語言不同之處在於: > variable 不是 ...

  7. 【转】Kotlin的inline内联函数

    原文链接:https://blog.csdn.net/Jaden_hool/article/details/78437947 方法调用流程 调用一个方法是一个压栈和出栈的过程,调用方法时将栈针压入方法 ...

  8. 别不信!servlet获取到的参数值,也许完全出乎你的意料!

    先贴出来简单得不能再简单的demo页面效果: 如下是spring mvc的Controller: @RequestMapping("mytest") @Controller pub ...

  9. grant localhost and % for mysql

  10. Redis 通过 scan 找出不过期的 key

    SCAN 命令是一个基于游标的迭代器(cursor based iterator):SCAN 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游 ...