线程隔离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. Thinkphp <= 5.0.10 缓存getshell复现

    目录 Thinkphp <= 5.0.10 缓存getshell复现 0x01 poc 0x02 跟踪源码 0x03 审计思路 0x04 补丁 0x05 参考 Thinkphp <= 5. ...

  2. (十六)c#Winform自定义控件-文本框哪里去了?-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  3. 一起学SpringMVC之入门篇

    本文属于SpringMVC的入门篇,属于基础知识,仅供学习分享使用,如有不足之处,还请指正. 什么是SpringMVC ? SpringMVC是一个基于Spring的MVC框架,继承了Spring的优 ...

  4. zabbix监控服务

    1.模板的重要 ​ 1.手动添加监控比较麻烦,监控项 -> 图形 -> 触发器. 问题: 1.例如: 100台服务器需要检查81端口 2.例如: 100台服务器81改成82 解决: 使用模 ...

  5. Java面试基础 -- Linux篇

    0.日常命令 cd 目录路径: 跳转到指定目录 mkdir 目录名称:新增目录 pwd: 获取当前路径 su: 切换用户 ll: 查看当前目录侠的文件和目录 rm -rf 目录: 递归删除指定目录下的 ...

  6. docker安装mysql、es、jenkins等一些步骤以及如何设置docker国内镜像

    CentOS7安装Docker步骤: (0)删除旧的可能安装过的包 yum remove docker \                   docker-client \              ...

  7. This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value

    iOS10 11之后遇到这种报错的小伙伴们请注意啦: 你会发现网上一大堆博客和论坛都是让你在  Info.plist 里面要涉及隐私数据时要添加一句“提示语”.于是打开 Info.plist,点击 + ...

  8. adb 控制手机动作

    下载adb​​工具包,解压即可  https://download.csdn.net/download/kai402458953/10784310 各种事件说明:https://blog.csdn.n ...

  9. WORD 和Uint16的区别

    UINT   A 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32-bit unsigned integer on Win32 ...

  10. 以特定用户和组来执行某个程序 - linux

    运行cockpit 服务时,我们指定运行此程序的用户和组:cockpit-ws cockpit-ws 我们使用 sudo -u -g 命令来进行运行: sudo -u cockpit-ws -g co ...