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 ...
随机推荐
- java8 stream取出 最大值/最小值
注:转载请注明出处!!! 这里直接用取出多个对象中某个值 最大/最小 来进行举例 直接看代码 /** * 时间测试类 */ class TimeTest { private Date time; pu ...
- dotnet sdk 的镜像tag 相关
https://hub.docker.com/_/microsoft-dotnet-core-sdk/ 微软的dotnet sdk 的 tag 微软貌似改默认镜像 dockerhub 里面的tag与 ...
- 修改admin中App的名称与表的名称
修改APP的名称: # coding:utf-8 from django.apps import AppConfig import os default_app_config = 'repositor ...
- Python RSA操作
公钥加密.私钥解密 # -*- coding: utf-8 -*- import rsa # rsa加密 def rsaEncrypt(str): # 生成公钥.私钥 (pubkey, privkey ...
- 30. Substring with Concatenation of All Words (JAVA)
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
- TreeView详细用法
Treeview用于显示按照树形结构进行组织的数据. Treeview控件中一个树形图由节点(TreeNode)和连接线组成.TtreeNode是TTreeview的基本组成单元. ...
- SVN服务之VisualSVN-Server和TortoiseSVN
SVN客户端程序:TortoiseSVN SVN服务器程序:VisualSVN-Server 目前有个项目,需要版本服务器,由于习惯了svn的使用,让这边搭建一台svn服务器,做了一下整理,只满足 ...
- java调用shell脚本小demo
复制指定文件cpp.sh: [root@localhost soft]# vim cpp.sh#!/bin/bash name="$1"\cp /home/soft/test/${ ...
- mysql 中文乱码 修改编码 utf8
在安装完数据库的时候,先不要创建数据库,先去更改字符集设置. show variables like 'character%'; vim /etc/my.cnf (注意 下面的字段文件内没有时,自 ...
- 【ARC101F】Robots and Exits 树状数组优化DP
ARC101F Robots and Exits 树状数组 有 $ n $ 个机器人和 $ m $ 个出口.这 $ n $ 个机器人的初始位置是 $ a_1,a_2.....a_n $ ,这 $ m ...