Flask_上下文(六)
Flask中有两种上下文,应用上下文(application context)和请求上下文(request context)
当客户端发来请求时,请求上下文就登场了。请求上下文里包含了请求的各种信息,比如请求的URL,请求的HTTP方法等。
上下文全局变量
视图函数需要上下文信息,flask将请求报文封装在request对象中,但是在视图函数中,并没有把它传进视图函数,而是直接从Flask导入一个全局的request对象,然后在视图函数里直接调用request的属性获取数据。为什么在处理请求时,视图函数里的request会自动包含对应请求的数据呢?因为flask在每个请求产生后自动激活当前请求的上下文,激活请求上下文后,会在request中新增一条带有线程号标识的数据,当每个请求结束后,flask就销毁对应的请求上下文。
我们在前面说request是全局对象,但这里的全局并不是实际意义上的全局。我们把这些变量理解为动态的全局变量。
在多线程服务中,在同一时间可能会有多个请求在处理。假设有三个客户端同时向服务器发送请求,这时每个请求都有各自不同的请求报文,所以请求对象必然是不同的。
因此,请求对象只在各自的线程内是全局的。flask通过本地线程(thread local)技术将请求对象在特定的线程和请求中全局可访问。
request对象标识数据结构大致如下:
request = {
"线程1": {"form": {"name": "张三", "age": 18}, "args": {}, "data": {}, ...},
"线程2": {"form": {}, "args": {"name": "李四", "age": 19}, "data": {}, ...}
}
为了方便获取这两种上下文环境那种存储的信息,flask提供了四个上下文全局变量
在不同的视图函数中,request对象都表示和视图函数对应的请求,就是当前请求(current request)。程序会有多个程序实例的情况,为了能获取对应的程序实例,而不是固定的某一个程序实例,我们就需要使用current_app变量。
g存储在程序上下文中,而程序上下文会随着每一个请求的进入而激活,随着每一个请求的处理完毕而销毁,所以每次请求都会重设这个g值。我们通常会使用它结合钩子来保存每个请求处理前所需要的全局变量。
当请求进入时,flask会自动激活请求上下文,这时可以使用request和session变量。当请求上下文被激活时,程序上下文也被自动激活。
除了上面四个上下文变量,依赖上下文的还有url_for()和jsonify()函数,所以只能在视图函数中使用它们。其中jsonify()函数内部调用中使用了current_app变量,url_for()则需要依赖请求上下文才可以正常运行。
Flask_上下文(六)的更多相关文章
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- ApacheCN React 译文集 20211118 更新
React 入门手册 零.前言 一.React 和 UI 设计简介 二.创建组件 三.管理用户交互 React 全栈项目 零.前言 一.使用 MERN 释放 React 应用 二.准备开发环境 三.使 ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- DDD实战进阶第一波(六):开发一般业务的大健康行业直销系统(实现产品上下文仓储与应用服务层)
前一篇文章我们完成了产品上下文的领域层,我们已经有了关于产品方面的简单领域逻辑,我们接着来实现产品上下文关于仓储持久化与应用层的用例如何来协调 领域逻辑与仓储持久化. 首先大家需要明确的是,产品上下文 ...
- [Xcode 实际操作]六、媒体与动画-(2)使用图形上下文转换图片为灰度图
目录:[Swift]Xcode实际操作 本文将演示如何将图片转换为灰度图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...
- [Xcode 实际操作]六、媒体与动画-(1)使用图形上下文按一定比例缩放图片
目录:[Swift]Xcode实际操作 本文将演示如何通过图形上下文,来实现图片缩放的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKi ...
- 六十八:flask上下文之app上下文和request上下文
app上下文: 先看现象 current_app源码 手动入栈 app_context()源码 with语句入栈 request上下文 不在app上下文中 即使手动入栈也会报错,不在请求上下文中 ur ...
- react入门(六):状态提升&context上下文小白速懂
一.状态提升 使用 react 经常会遇到几个组件需要共用状态数据的情况.这种情况下,我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理. 原理:父组件基于属性把自己的一个fn函数传递给子组 ...
- Scala 基础(十六):泛型、类型约束-上界(Upper Bounds)/下界(lower bounds)、视图界定(View bounds)、上下文界定(Context bounds)、协变、逆变和不变
1 泛型 1)如果我们要求函数的参数可以接受任意类型.可以使用泛型,这个类型可以代表任意的数据类型. 2)例如 List,在创建 List 时,可以传入整型.字符串.浮点数等等任意类型.那是因为 Li ...
随机推荐
- vue 中使用import导入 script 在线链接
一般我们在vue中导入另外一个文件或者文件中的方法,我们都是使用import来实现他的,那么问题来了,现在我们要导入的不是另外的一个文件,而是在线链接,这该怎么办?我们也使用了 import * as ...
- 【Spark】【设置】关闭INFO提示
目的:关闭INFO提示 方法:通过修改配置文件实现 操作文件:Hadoop/conf/log4j.properties.template 操作1:复制模板文件使用 cp $SPARK_HOME/con ...
- CSS伪类选择器实现三角形
使用css实现常用的三角效果 项目中三角: .breadcrumb{ height: 40px; line-height: 40px; padding: 0 20px; border-top: 1px ...
- Gitlab用户在组中有五种权限
Gitlab用户在组中有五种权限:Guest.Reporter.Developer.Master.Owner Guest:可以创建issue.发表评论,不能读写版本库 Reporter:可以克隆代码, ...
- Nginx日志分析脚本
目录 一.简介 二.脚本 一.简介 运维工作是一个比较复杂的工作,有时候面对上万条的日志,如何作分析?难道一条条的分析? 这估计看两眼就要打哈欠了吧?聪明的人会选择脚本,这就是为什么现在提倡自动化运维 ...
- 虚拟机快照和linux基础命令
虚拟机快照 磁盘"快照"是虚拟机磁盘文件(VMDK)在某个点及时的副本.可以通过使用恢复到快照来保持磁盘文件和系统存储. 1.拍摄快照 拍摄快照前先关机,然后右键点击虚拟机=> ...
- [BUUCTF]PWN——picoctf_2018_buffer overflow 1/2
picoctf_2018_buffer overflow 1 附件 步骤: 例行检查,32位程序,没开保护 本地运行一下程序,看看程序大概的执行情况 32位ida载入,习惯性的检查程序里的字符串,发现 ...
- 替换资源(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 还是那个熟悉的某吃货甲,一天之内给他分配了9.6个工时的吃量,这太不厚道了哈,人家一个人又要开吃又要喝汤,这怎么吃得消呢? ...
- CF1291A Even But Not Even 题解
Content 有 \(t\) 组数据,每组数据给定一个整数 \(n\),接着给出一个长度为 \(n\) 的数字串.请从中删除一些数,使得剩下的数字串不是偶数,但是其和为偶数,或者不存在这样的方案. ...
- curl常用选项
下载单个文件,默认将输出打印到标准输出中(STDOUT)中 curl http://www.centos.org 通过-o/-O选项保存下载的文件到指定的文件中:-o:将文件保存为命令行中指定的文件名 ...