flask-深入了解学习--关于请求上下文、应用上下文的个人理解

前情提要:

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 的方法,能够直接获取到其内部的配置信息,并达到自己想要的效果
不会造成文件的循环导入
'''

以上就是对请求、应用上下文的粗浅理解,并记录了简单的使用方式,具体使用还需要根据具体项目内容进行灵活的变通

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wx-zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值