【Flask】flask上下文

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 【Flask】flask上下文,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123408.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!