flask的请求上下文request对象
Flask从客户端收到请求时,要让视图函数能访问请求对象request ,才能处理请求。我们可以将request对象作为参数传到试图函数里,比如:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world(request): # 在这里将request对象作为参数传进来
data = request.json
return 'hello world'
if __name__ == '__main__':
app.run()
但是我们也可能会使用一些其他对象,这样传来传去,不仅影响简洁,而且容易出错。
为了解决这个问题,利用“请求上下文”,将request对象“当作”全局变量,也就是这单个线程中是全局变量,但是A线程的request对象只在A线程是全局变量,在B线程就不是全局变量,以此来保证请求对象不会混乱出错
所以平时我们这样写就可以了 :
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello_world():
data = request.json
return 'hello world'
if __name__ == '__main__':
app.run()
也就是request对象只有单线程中才能被访问,A线程就不能访问B线程的request对象。比如我们用线程池实现异步,子线程中的函数就不能访问request对象,举例:
from flask import Flask,request
import time
from concurrent.futures import ThreadPoolExecutor app = Flask(__name__)
executor = ThreadPoolExecutor(2) @app.route('/')
def update_redis():
executor.submit(do_update) # 这里我们开启一个线程,跑do_update
return 'hello world' def do_update():
r_json = request # 程序会卡在这里,因为子线程不能访问主线程的request对象
time.sleep(5)
print('start update',r_json,type(request)) if __name__ == '__main__':
app.run()
那么我们如何解决这种问题呢,用最简单的办法,就是将主线程中的request对象作为参数传给子线程中的函数中。举例:
from flask import Flask,request
import time
from concurrent.futures import ThreadPoolExecutor app = Flask(__name__)
executor = ThreadPoolExecutor(2) @app.route('/')
def update_redis():
r_json = request.json
executor.submit(do_update,(r_json)) # 将request对象的json数据作为参数,传给子线程中的函数处理
return 'hello world' def do_update(r_json):
time.sleep(3)
print('start update',r_json) if __name__ == '__main__':
app.run()
这样就可以解决子线程无法访问主线程的request对象的数据问题了。如果有更好的办法,希望联系我,相互交流,共同进步。
flask的请求上下文request对象的更多相关文章
- python 全栈开发,Day139(websocket原理,flask之请求上下文)
昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...
- flask的请求上下文源码解读
一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...
- python web开发-flask访问请求数据request
Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...
- Flask(7)- request 对象
Flask 中很重要的 request 对象 浏览器访问服务端时,向服务端发送请求 Flask 程序使用 request 对象描述请求信息 当你想获取请求体.请求参数.请求头数据的时候,就需要靠 re ...
- Flask之请求上下文流程图
整理一下Flask请求上下文流程导思流程图,如果错误,请指出.
- Flask请求上下文request
- flask 请求上下文
一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)
一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...
随机推荐
- Windows Server 2012 上安装 dotNET Framework v3.5
Windows Server 2012不能直接运行dotNET Framework v3.5安装程序进行安装,系统提供通过服务器管理器的添加功能和角色向导进行安装. 安装的前几个步骤再这里略去,在默认 ...
- Ajax请求后台数据
一.前期准备 安装好XAMPP软件,并运行起来.本文代码是基于XAMPP开发环境,XAMPP是完全免费且易于安装的Apache发行版,其中包含MariaDB.PHP和Perl.XAMPP开放源码包的设 ...
- Python 里面如何生成随机数?
在 Python 中用于生成随机数的模块是 random,在使用前需要 import. 如下例子可以酌情列举: random.random():生成一个 0-1 之间的随机浮点数: random.un ...
- dsu on tree 与长链剖分
dsu on tree 对于树进行轻重链剖分,对于节点 $x$ ,递归所有轻儿子后消除其影响,递归重儿子,不消除其影响. 然后对于所有轻儿子的子树暴力,从而得到 $x$ 的答案. 对于要消除暴力消除即 ...
- Vue双向绑定的实现原理及简单实现
vue数据双向绑定原理 vue数据双向绑定是通过(数据劫持)+(发布者-订阅者模式)的方式来实现的,而所谓的数据劫持就是通过Object.defineProperty() 来实现的,所谓的Obje ...
- 2Ubuntu学习
1.设置Ubuntu系统的英文设置成中文 2.root用户密码设置 3.
- macos升级Nodejs和Npm到最新版
第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...
- wepy-开发总结(功能点)
开发小程序中,遇到的wepy的几点坑,记录一下; 更详细的项目总结记录请见我的个人博客:https://fanghongliang.github.io/ 1.定时器: 在页面中有需要用到倒计时或者其他 ...
- 3.docker镜像管理基础
一.docker镜像相关 1.About Docker Image Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器. 采用分层构建机制,最底层为bootf ...
- Linux发行版和内核版本
1./etc/issue 和 /etc/redhat-release都是系统安装时默认的发行版本信息,通常安装好系统后文件内容不会发生变化. 2.lsb_release -a :FSG(Free St ...