前情提要:
Flask 将上下文分为了两种:分别是请求上下文和应用上下文
Flask 中上下文对象:相当于一个容器,保存了 Flask 程序运行的一些信息
请求上下文
首先通过一段代码对请求上下文的内容进行初步解释
from flask import Flask, request
app = Flask(__name__)
@app.route('/articles')
def articles():
channelid = request.args.get('channelid')
if channel_id is None:
abort(400) # 400 Bad Request
return f'get articles of channel {channelid}'
'''
flask 中的request对象是全局变量
当多个用户同时发起同一个操作的时候
比如说 现在项目已经启动 两个用户同时进行两次调用的时候
A用户 =》 /articles?channel_id=123 -> thread A -> 123?
B用户 =》 /articles?channel_id=124 -> thread B -> 124?
'''
这个时候会不会造成返回内容的错误呢?
因为是同时进行,request 又是全局变量,会不会 A 得到的是 124 而不是 123 呢?
最后的结果是会对应的线程返回对应的参数,这里可以理解为flask对其进行了一种特殊的包装(如果要详细了解,可以看flask的请求上下文
就好比一个人和不同人说话的时候会根据不同的情况,针对不同的人说的话也就不一样
请求上下文包括:
request
封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get(‘user’),获取的是get请求的参数。
session
用来记录请求会话中的信息,针对的是用户信息。举例:session[‘name’] = user.id,可以记录用户信息。还可以通过session.get(‘name’)获取用户信息。
应用上下文
它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。
应用上下文对象有:current_app,g
这里主要记录 current_app 的一些相关用法(g对象相关的内容后续学习后会跟进)
其实 current_app 的主要操作对象就是 flask 实例化对象 app,这里我们可以简单的将 current_app 理解为 flask 在实例化对象 app 的时候,将current_app 作为一个中间件,用来储存 app 里的内容,如果说得简单直白点, current_app 其实也就是你实例化的 app 对象(这里说的是仅实例化一个对象的情况)
来个测试的例子:
这里我们写一个主函数 main.py
from flask import Flask, request
app = Flask(__name__)
app.config['ameame'] = '萧瑟'
然后我们写一个测试蓝图:test.py
from flask import Blueprint, current_app
bp = Blueprint('passport', __name__)
@bp.route('/bp')
def viewfunc():
return 'ok'
如果我们想在蓝图中,获取到 app 中的 config,并在蓝图中进行输出或者存储在一个对象中,我们需要怎么做?
- 方法 1
from flask import Blueprint, current_app
from main import app
bp = Blueprint('passport', __name__)
temp = app.config['ameame']
'''
通过这种直接导入的方法看起来似乎比较简单快捷,能够直接达到目的效果,但是我们需要考虑到一个问题:
因为蓝图最后是需要在 main 函数中进行注册的,最后是需要在 main.py 中进行导入的
这样写会造成两个文件的重复循环导入,而浪费很多不必要的资源,因此这种方法其实不可取!
'''
- 方法 2
from flask import Blueprint, current_app
bp = Blueprint('passport', __name__)
@bp.route('/bp')
def viewfunc():
print(current_app.config['ameame'])
return 'ok'
'''
通过导入应用上下文 - current_app 的方法,能够直接获取到其内部的配置信息,并达到自己想要的效果
不会造成文件的循环导入
'''
以上就是对请求、应用上下文的粗浅理解,并记录了简单的使用方式,具体使用还需要根据具体项目内容进行灵活的变通