关于Flask 上下文详细介绍
作者:tigeriaf 发布时间:2023-12-10 01:52:32
1、上下文概念
上下文,说白了就是所谓的语境,就是语言环境。比如单独拎出来一篇文章的某一句话,我们可能不能理解它的意思,但是通过这句话所处的语言环境,再结合它前后的语句,就能很轻易的理解。
我们可以把上下文理解为当前环境的快照,是一个用来保存状态的对象。在代码执行的某个时刻,根据上下文的代码逻辑,可以决定在当前时刻下使用到的环境变量等。
2、Flask中的上下文
Flask
中有两种上下文,应用上下文(application context
)和请求上下文(request context
):
application
:指的是调用app = Flask(__name__)
创建的Flask
对象request
:指的是每次HTTP
请求发生时,在Flask
对象内部创建的Request
对象
2.1请求上下文
在Flask
中处理请求时,应用会生成“请求上下文”对象,保存当前请求的相关数据信息,整个请求的处理过程,都会在这个上下文对象中进行,保证请求的处理过程独立不受干扰。
请求上下文对象有:request
和session
,下面以request
为例具体讲解。
在上篇文章Flask 请求钩子的实现 我们说过,在 Flask
中有四种常用的请求钩子,分别是:before_first_request
、before_request
、after_request
和teardown_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_app
和g
。
我们了解到,每个请求,都有一个 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")
来源:https://juejin.cn/post/7031340663019044895
猜你喜欢
- 希腊Web 设计师Christos Chiotis 发表在 CssGlobe 的一篇文章,讲述了黄金分割率在 CSS 中的应用。黄金分割率是
- 网上asp加密字符的MD5很多,也很普遍,因为受到asp语言本身的限制,对文件进行md5介绍的文章很少,本文通过2种方式来谈谈如何通过asp
- 一个简单的for语句就能循环字典的所有键,就像处理序列一样:In [1]: d = {'x':1, 'y':
- 代码如下import numpy as npfrom matplotlib import pyplot as plt# 用numpy生成数据
- 前段时间喜欢用python去抓一些页面玩,但都基本上都是用get请求一些页面,再通过正则去过滤。今天试了一下,模拟登陆个人网站。发现也比较简
- 本文实例讲述了Python简单遍历字典及删除元素的方法。分享给大家供大家参考,具体如下:这种方式是一定有问题的:d = {'a
- 说完了理论,我们来做点实事。这篇文章将介绍使用 Javascript 实现的动画组件。下面记录下当时编写这个组件的考虑的些问题,对技术细节感
- 持续更新一些常用的Tensor操作,比如List,Numpy,Tensor之间的转换,Tensor的拼接,维度的变换等操作。其它Tensor
- 一 简单介绍wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信
- 前言前面写过一篇用Python制作PPT的博客,感兴趣的可以参考用Python制作PPT这篇是关于用Python进行数据可视化的,准备作为一
- 本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法。分享给大家供大家参考,具体如下:当TXT文件太大,计算
- 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding=
- 可用性研究表明,当响应时间超过一秒钟时,用户便能够有所察觉。虽然在反馈系统中,当用户需要等待时,更好的解决方案的是应该采用确定性的进度条。但
- 这里列出了13种实现图片或网页内容 lightbox 效果的方法,大部分是链接到各种lightbox作者的英文页面,里面都有源代码下载。Th
- 先由exp把数据卸出到文件系统, 产生一个.dmp文件, 然后必要时再由imp将数据装入数据库. 对于一般中小型数据库来说, 全数据库的ex
- 本文实例讲述了PHP登录验证功能。分享给大家供大家参考,具体如下:登录界面具体实现方法如下:login.html<!DOCTYPE h
- 代码如下: '排序 Function Sort1(ary) Dim KeepChecking,I,FirstValue,Second
- PHP str_split() 函数实例把字符串 "Hello" 分割到数组中:<?php print_r(str
- pandas读取、写入csv数据非常方便,但是有时希望通过excel画个简单的图表看一下数据质量、变化趋势并保存,这时候csv格式的数据就略
- 一、前言在Python提供了re模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法(如,search()、match()、