【Flask】flask上下文

上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。

Flask中有两种上下文,请求上下文和应用上下文
Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。

一、请求上下文

思考:在视图函数中,如何取到当前请求的相关数据?比如:请求地址,请求方式,cookie等等
在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session

  • 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

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

  • 应用的启动脚本是哪个文件,启动时指定了哪些参数
  • 加载了哪些配置文件,导入了哪些配置
  • 连了哪个数据库
  • 有哪些public的工具类、常量
  • 应用跑在哪个机器上,IP多少,内存多大

代码块:

在app.py文件设置一个任意参数,去蓝图中去拿这个定义的参数

from flask import Flask
from item蓝图 import item_bp
app = Flask(__name__)

app.zilv='hello zilv'  #往app中设置任意的一个参数

app.register_blueprint(item_bp,url_prefix='/item')

@app.route('/')
def hello_world():
    return 'hello world'



if __name__ == '__main__':
    app.run(debug=True)

代码块

在蓝图文件中,通过current_app.参数名,去获得这个参数值

from flask import Flask,Blueprint,current_app

from db_handler import find_items

#创建蓝图
item_bp=Blueprint('item',__name__)

#蓝图中创建视图函数
@item_bp.route('/get')
def hello_item():
    print(current_app.zilv)
    return "产品模块的页面"

特别注意:current_app是app的代理对象,在蓝图中,任何地方不方便取app文件中参数的情况下,都可以用current_app来获得

三、G对象

g 作为 flask 程序全局的一个临时变量,充当中间媒介的作用,我们可以通过它在一次请求调用的多个函数间传递一些数据。每次请求都会重设这个变量

案例:

在视图中,通过g对象获得了从客户端传来的数据,

from flask import Flask,Blueprint,current_app,g

from db_handler import find_items

#创建蓝图
item_bp=Blueprint('item',__name__)

#蓝图中创建视图函数
@item_bp.route('/get')
def hello_item():
    print(current_app.zilv)
    #从请求参数中获得
    g.item_id='666'
    g.item_name='qqq'
    find_items()
    return "产品模块的页面"

在另外一个应用文件中想获得从客户端传来的数据,也通过g对象
例如

from flask import g

def find_items():
    print('从数据库中查询数据,通过多个不确定的条件')
    print(g.item_id)
    print(g.item_name)

运行结果:

hello zilv
从数据库中查询数据,通过多个不确定的条件
666
qqq

而如果不用g对象的话 举例:

蓝图视图模块

from register import register_bp
from flask import Flask,render_template,current_app
from register.handle_db import handle


@register_bp.route('/view')
def register_view():
    print(current_app.kobe)
    user_id='666'
    handle()
    return 'ok'

获得视图中的数据模块

from flask import Flask

def handle():
    print(user_id)

执行项目后:NameError: name ‘user_id’ is not defined

在这里插入图片描述
所以:g 作为 flask 程序全局的一个临时变量,充当中间媒介的作用,我们可以通过它在一次请求调用的多个函数间传递一些数据。每次请求都会重设这个变量

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

敲代码敲到头发茂密

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

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

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

打赏作者

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

抵扣说明:

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

余额充值