Flask 上下文机制和线程隔离

  1. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决, 上下文机制就是这句话的体现。

  2. 如果一次封装解决不了问题,那就再来一次

上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息 源码:flask/ctx.py

请求上下文:Flask从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求,要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数,除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。为了避免大量可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为全局可访问。这就是一种重构设计思路。

request 封装了HTTP请求的内容,针对http请求,也是一种符合WSGI接口规范的设计(关于WSGI可参考我对该协议的理解和实现demo mini-wsgi-web),如 request.args.get(‘user’)
session 用来记录请求会话中的信息,针对的是用户信息,如 session[‘name’] = user.id
应用上下文:应用程序上下文,用于存储应用程序中的变量

current_app 存储应用配置,数据库连接等应用相关信息
g变量 作为flask程序全局的一个临时变量, 充当者中间媒介的作用,我们可以通过它传递一些数据,g保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别
Copy

context locals

使用代理模式 LocalProxy

_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, ‘request’))
session = LocalProxy(partial(_lookup_req_object, ‘session’))
g = LocalProxy(partial(_lookup_app_object, ‘g’))

  1. working outside application context#
    Copy
    #!/usr/bin/python3

-- coding: utf-8 --

author = ‘JonPan

from flask import Flask, current_app

app = Flask(name)
a = current_app

is_debug = current_app.config[‘DEBUG’]

@app.route(’/’)
def index():
return ‘

Hello World. Have a nice day! </1>’

if name == ‘main’:
app.run(host=‘localhost’, port=8888)
报错:

Exception has occurred: RuntimeError

Working outside of application context.

  1. flask 上下文出入栈#
    flask上下文对象出入栈模型图

flask上下文对象出入栈模型图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值