温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Flask上下文举例分析

发布时间:2021-11-26 10:37:22 来源:亿速云 阅读:151 作者:iii 栏目:开发技术

本篇内容介绍了“Flask上下文举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、上下文概念

上下文,说白了就是所谓的语境,就是语言环境。比如单独拎出来一篇文章的某一句话,我们可能不能理解它的意思,但是通过这句话所处的语言环境,再结合它前后的语句,就能很轻易的理解。

我们可以把上下文理解为当前环境的快照,是一个用来保存状态的对象。在代码执行的某个时刻,根据上下文的代码逻辑,可以决定在当前时刻下使用到的环境变量等。

2、Flask中的上下文

Flask 中有两种上下文,应用上下文(application context)和请求上下文(request context):

  • application:指的是调用app = Flask(__name__)创建的 Flask 对象

  • request:指的是每次 HTTP 请求发生时,在 Flask 对象内部创建的 Request 对象

2.1请求上下文

Flask中处理请求时,应用会生成“请求上下文”对象,保存当前请求的相关数据信息,整个请求的处理过程,都会在这个上下文对象中进行,保证请求的处理过程独立不受干扰。

请求上下文对象有:requestsession,下面以request为例具体讲解。

在上篇文章Flask  请求钩子的实现 我们说过,在 Flask 中有四种常用的请求钩子,分别是:before_first_requestbefore_requestafter_requestteardown_request

@app.before_first_request

def before_first_request():

    print(request.url)

    print('before_first_request')

@app.before_request

def before_request():

    print(request.url)

    print('before_request')





@app.after_request

def after_request(response):

    print(request.url)

    print('after_request')

    return response

@app.teardown_request

def teardown_request(e):

    print(request.url)

    print('teardown_request')

@app.route('/test')

def test():

    print(request.url)

    return 'test'

通过请求我们发现,在每个请求钩子装饰的处理函数中,我们都可以直接访问 request 对象。而且,在其他普通函数内,无法访问 request 对象,说明 request 对象并不是真正的全局变量,只是在请求上下文的生命周期内可以访问,离开了请求的生命周期,就无法访问了。上面的请求钩子装饰的处理函数,在请求处理的不同阶段执行,自然其内部也可以访问 request 对象。

2.2应用上下文

上面说请求上下文是和请求相关,请求上下文对象保存的是请求的相关数据信息,下面说一下应用上下文,所谓应用上下文,就是和当前应用相关的,应用上下文对象是包含当前应用相关的信息。

应用上下文对象有:current_appg

我们了解到,每个请求,都有一个 request 对象和视图函数对应,可以理解为当前请求(current request), 而程序也会有多个实例的情况,为了能获取对应的程序实例,而不是固定的某一个程序实例,我们就需要使用 current_app变量。

from flask import Flask, current_app

app = Flask("tigeriaf_app")

@app.route('/')

def index():

    return 'Hello, {}!'.format(current_app.name)

current_app是一个本地代理,它的类型是werkzeug.local.LocalProxy,它所代理的即是app对象,也就是说current_app == LocalProxy(app)。所以通过current_app.name可以获取当前应用的名称,也就是tigeriaf_app,使用current_app是因为它也是一个ThreadLocal变量,对它的改动不会影响到其他线程。我们可以通过current_app._get_current_object()方法来获取app对象。也可以在current_app中存储一些自定义的变量。

current_app只在请求线程内存在,它的生命周期就是在应用上下文里。离开了应用上下文,current_app一样无法使用。

g对象是 Flask 程序全局的一个临时变量,充当中间媒介的作用。我们可以通过它传递一些数据,g保存的是当前请求的全局变量,每次请求都会重设这个值,我们通常会使用它结合请求钩子来保存每个请求处理前所需要的全局变量,比如当前登入的用户对象,数据库连接等。 比如,使用g对象保存请求的 token,在视图函数中就可以直接使用g.name获取对应的值了。

from flask import g

@app.before_request

def get_token():

    g.name = request.headers.get("token")

“Flask上下文举例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI