Flask从客户端收到请求时,要让视图函数能访问请求对象request ,才能处理请求。我们可以将request对象作为参数传到试图函数里,比如:

  1. from flask import Flask, request
  2.  
  3. app = Flask(__name__)
  4.  
  5. @app.route('/')
  6. def hello_world(request): # 在这里将request对象作为参数传进来
  7. data = request.json
  8. return 'hello world'
  9.  
  10. if __name__ == '__main__':
  11. app.run()

  

但是我们也可能会使用一些其他对象,这样传来传去,不仅影响简洁,而且容易出错。
为了解决这个问题,利用“请求上下文”,将request对象“当作”全局变量,也就是这单个线程中是全局变量,但是A线程的request对象只在A线程是全局变量,在B线程就不是全局变量,以此来保证请求对象不会混乱出错

所以平时我们这样写就可以了 :

  1. from flask import Flask, request
  2.  
  3. app = Flask(__name__)
  4.  
  5. @app.route('/')
  6. def hello_world():
  7. data = request.json
  8. return 'hello world'
  9.  
  10. if __name__ == '__main__':
  11. app.run()

也就是request对象只有单线程中才能被访问,A线程就不能访问B线程的request对象。比如我们用线程池实现异步,子线程中的函数就不能访问request对象,举例:

  1. from flask import Flask,request
  2. import time
  3. from concurrent.futures import ThreadPoolExecutor
  4.  
  5. app = Flask(__name__)
  6. executor = ThreadPoolExecutor(2)
  7.  
  8. @app.route('/')
  9. def update_redis():
  10. executor.submit(do_update) # 这里我们开启一个线程,跑do_update
  11. return 'hello world'
  12.  
  13. def do_update():
  14. r_json = request # 程序会卡在这里,因为子线程不能访问主线程的request对象
  15. time.sleep(5)
  16. print('start update',r_json,type(request))
  17.  
  18. if __name__ == '__main__':
  19. app.run()

  那么我们如何解决这种问题呢,用最简单的办法,就是将主线程中的request对象作为参数传给子线程中的函数中。举例:

  1. from flask import Flask,request
  2. import time
  3. from concurrent.futures import ThreadPoolExecutor
  4.  
  5. app = Flask(__name__)
  6. executor = ThreadPoolExecutor(2)
  7.  
  8. @app.route('/')
  9. def update_redis():
  10. r_json = request.json
  11. executor.submit(do_update,(r_json)) # 将request对象的json数据作为参数,传给子线程中的函数处理
  12. return 'hello world'
  13.  
  14. def do_update(r_json):
  15. time.sleep(3)
  16. print('start update',r_json)
  17.  
  18. if __name__ == '__main__':
  19. app.run()

  这样就可以解决子线程无法访问主线程的request对象的数据问题了。如果有更好的办法,希望联系我,相互交流,共同进步。

flask的请求上下文request对象的更多相关文章

  1. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

  2. flask的请求上下文源码解读

    一.flask请求上下文源码解读 通过上篇源码分析( ---Flask中的CBV和上下文管理--- ),我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__ ...

  3. python web开发-flask访问请求数据request

    Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#fla ...

  4. Flask(7)- request 对象

    Flask 中很重要的 request 对象 浏览器访问服务端时,向服务端发送请求 Flask 程序使用 request 对象描述请求信息 当你想获取请求体.请求参数.请求头数据的时候,就需要靠 re ...

  5. Flask之请求上下文流程图

    整理一下Flask请求上下文流程导思流程图,如果错误,请指出.

  6. Flask请求上下文request

  7. flask 请求上下文

    一篇引用大牛的 https://www.cnblogs.com/zhaopanpan/p/9457343.html ### 线程安全 ```python# 线程不安全class Foo(object) ...

  8. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  9. Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)

    一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...

随机推荐

  1. java8 stream取出 最大值/最小值

    注:转载请注明出处!!! 这里直接用取出多个对象中某个值 最大/最小 来进行举例 直接看代码 /** * 时间测试类 */ class TimeTest { private Date time; pu ...

  2. dotnet sdk 的镜像tag 相关

    https://hub.docker.com/_/microsoft-dotnet-core-sdk/ 微软的dotnet sdk 的 tag 微软貌似改默认镜像 dockerhub 里面的tag与 ...

  3. 修改admin中App的名称与表的名称

    修改APP的名称: # coding:utf-8 from django.apps import AppConfig import os default_app_config = 'repositor ...

  4. Python RSA操作

    公钥加密.私钥解密 # -*- coding: utf-8 -*- import rsa # rsa加密 def rsaEncrypt(str): # 生成公钥.私钥 (pubkey, privkey ...

  5. 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 ...

  6. TreeView详细用法

    Treeview用于显示按照树形结构进行组织的数据.          Treeview控件中一个树形图由节点(TreeNode)和连接线组成.TtreeNode是TTreeview的基本组成单元. ...

  7. SVN服务之VisualSVN-Server和TortoiseSVN

    SVN客户端程序:TortoiseSVN SVN服务器程序:VisualSVN-Server   目前有个项目,需要版本服务器,由于习惯了svn的使用,让这边搭建一台svn服务器,做了一下整理,只满足 ...

  8. java调用shell脚本小demo

    复制指定文件cpp.sh: [root@localhost soft]# vim cpp.sh#!/bin/bash name="$1"\cp /home/soft/test/${ ...

  9. mysql 中文乱码 修改编码 utf8

    在安装完数据库的时候,先不要创建数据库,先去更改字符集设置. show variables like 'character%'; vim /etc/my.cnf   (注意 下面的字段文件内没有时,自 ...

  10. 【ARC101F】Robots and Exits 树状数组优化DP

    ARC101F Robots and Exits 树状数组 有 $ n $ 个机器人和 $ m $ 个出口.这 $ n $ 个机器人的初始位置是 $ a_1,a_2.....a_n $ ,这 $ m ...