-
计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决, 上下文机制就是这句话的体现。
-
如果一次封装解决不了问题,那就再来一次
上下文:相当于一个容器,保存了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’))
- 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.
- flask 上下文出入栈#
flask上下文对象出入栈模型图
flask上下文对象出入栈模型图
在