Local线程隔离对象

我们知道通过request可以获取表单中的数据。如果是多个用户同时在用网站,而全局request就只有一个,那么Flask是如何分辨哪用户对应哪个请求呢?

这种情况下,就会用到Local对象,只要绑定在Local对象上的属性,在每个线程中都是隔离的

我们看看,使用多线程修改值,不用local对象时,因为request是全局共享的,只要修改了它的值,就会影响到其它线程!

当我们使用Local对象绑定时,因为在每个线程中都是隔离的,所以不会影响到其它线程

总结:

1、在Flask中,类似于request的对象(还有session等),其实是绑定到了一个werkzeug.local.Local对象上。这样,即使是同一个对象,那么多个线程中都是隔离的。

2、只要满足绑定到这个对象上的属性,在每个线程中都是隔离的,那么它就叫做Thread Local对象

app上下文

app上下文存放在一个LocalStack的栈中,和app应用相关的操作就必须要应用上下文,比如通过current_app获取当前这个app的名字

启动访问浏览器首页

如果我们把print(current_app.name)放到视图函数外面,就会报错

在视图函数中,不用担心上下文的问题,因为视图函数要执行,肯定是通过url的方式执行的,这种情况下,Flask底层就已经自动的帮我们把应用上下文推入到相应的栈中。如果要在视图函数外面执行相关的操作,就必须手动推入上下文。

请求上下文

请求上下文也是存放在一个LocalStack栈中,请求的相关的操作就必须用到请求的上下文,比如url_for反转视图函数

因为在视图函数图,会自动推入上下文,所以正常执行

当在视图函数外面执行,没有请求上下文的关系则会报错

错误提示是没有app上下文推入,那么我们就使用前面的方法推入app上下文

推入app上下文后,又出错,没有请求上下文

因此,手动推入请求上下文:推入请求上下文到栈中,会首先判断有没有应用上下文,如果没有那么就会先推入应用上下文到栈中,然后再推入请求上下文到栈中

为什么上下文需要放在栈中

2、Flask底层是基于werkzeug,werkzeug是可以包含多个app的,所以这时候用一个栈来保存,如果你在使用app1,那么app1应该是要在栈的顶部,如果用完了app1那么app应该从栈中删除,方便其他代码使用下面的app。

2、如果在写测试代码,或者离线脚本的时候,我们有时候可能需要创建多个请求上下文,这时候就需要存放到一个栈中了。使用哪个请求上下文的时候,就把对应的请求上下文放到栈的顶部,用完了就要把这个请求上下文从栈中移除掉。

线程隔离的g对象

g对象是在整个Flask应用运行期间都是可以使用的,并且它也是跟request一样是线程隔离的。这个对象是专门用来存储开发者自定义的一些数据,方便在整个Flask程序中都可以使用。一般使用就是,将一些经常会用到的数据绑定到上面,以后就直接从g上面取就可以了,而不是通过传参的形式,这样更加方便。

比如当我们访问首页的时候会调用一些函数打印日志,并且这个这个会打印出用户名

新建一个utils.py专门用来存储这些工具函数,如下

这样做虽然可以实现需求,但是每条调用都必须传入username参数才可以,如果使用g就方便多了

把username存入到g.username中

函数那边直接调用g.username就可以了

20、Flask实战第20天:Flask上下文的更多相关文章

  1. Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号

    Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...

  2. Flask实战-留言板-安装虚拟环境、使用包组织代码

    Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...

  3. flask你一定要知道的上下文管理机制

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

  4. flask之--钩子,异常,上下文,flask-script,模板,过滤器,csrf_token

    一.请求钩子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: - 在请求开始时,建立数据库连接: - 在请求开始时,根据需求进行权限校验: - 在请求结束时,指定数据的交互格式: ...

  5. 1、Flask实战第1天:第一个Flask程序

    Flask是流行的python web框架...(* ̄︶ ̄) 零基础到企业级论坛实战,人生苦短,我用python,开启FLask之旅吧... 安装开发环境 下载Python win版安装包 双击运行, ...

  6. Flask从入门到精通之flask安装

    使用虚拟环境 安装Flask最简单的方式是使用虚拟环境,虚拟环境是python解释器的一个私有副本,在这个环境中你可以安装私有包,而且不会影响系统中安装的全局的Python解释器.虚拟环境非常有用,可 ...

  7. 【Flask】微型web框架flask大概介绍

    Flask Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持 ...

  8. 02 flask源码剖析之flask快速使用

    02 flask快速使用 目录 02 flask快速使用 1.flask与django的区别 2. 安装 3. 依赖wsgi Werkzeug 4. 快速使用flask 5. 用户登录&用户管 ...

  9. flask tutorial => make a blog :) flask 搭建博客系统从零开始!

    please follow the tutorial from the official site :) http://flask.pocoo.org/docs/ You could download ...

随机推荐

  1. SQL语言:结构化查询语言

    SQL语言:结构化查询语言 程序员或者DBA(数据库管理员)使用SQL和DBBSM进行交互,操纵数据库中的资源 分类: 1.DDL 数据定义语言 结构 create  创建   database ta ...

  2. 【CF MEMSQL 3.0 B. Lazy Security Guard】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  3. input checkbox 多选 验证

    # input checkbox 多选 验证``` <ul class="orderMsg_radio"> <!--单选--> <input valu ...

  4. bulk_insert_buffer_size and InnoDB

    Q: I read the following on this page http://dev.mysql.com/doc/mysql/en/server-system-variables.html ...

  5. POJ2240:Arbitrage(最长路+正环)

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29374   Accepted: 12279 题目链接: ...

  6. ng websocket

    ng使用websocket 1.安装依赖库npm install ws --save 2.安装类型定义文件 npm install @types/ws --save 3.编写服务 import { I ...

  7. sqrti128

    求平方根下取整,对于gcc type __uint128_t. ~45.5ns/op on i7-7700k@4.35G,即typical <200cyc/op. Together with u ...

  8. Kafka配置文档

    http://kafka.apache.org/08/configuration.html

  9. LVS+Keepalived搭建MyCAT高可用負載均衡集群

    1.前面我们已经搭建好mysql主主,并且用mycat实现双写功能,主要配置文件: [root@mycat2 conf]# cat schema.xml <?xml version=" ...

  10. HDU 1877 又一版 A+B(进制转换)

    看了http://lovnet.iteye.com/blog/1690276的答案 好巧妙的方法 递归实现十进制向m进制转换 #include "stdio.h" int m; v ...