何时应该使用 Flask.g

Flask 中的 Flask.g 模块是什么

G 模块或 Flask.g 由 Flask 提供,开发人员在开发 Flask 应用程序时将其用作全局对象,以在 Flask 应用程序或单个请求的上下文中存储和访问数据或任何全局变量。

何时应使用"flask.g"

正如我们在简介中讨论的那样,Flask 提供的 g 变量可以用作 Flask 应用中的路由请求的上下文。但这里有一些应该使用 flask.g 的常见场景,

  1. 你可以使用flask.g 来存储你需要访问数据库的每个请求的连接或会话数据,以便在你的Flask 应用程序连接到某个数据库时随时可用。
  2. 我们需要共享某些配置变量作为请求的一部分的情况可能是另一个用例。
  3. 如果你想保留在许多用户信息请求中加载的某些用户数据或密码,"flask.g"非常有用。

现在你已经知道"flask.g"是什么了,让我带你快速演示如何使用 Flask 应用程序创建、存储和访问"flask.g"变量。我将使用 FlaskHTTPAuth,这是一个扩展,它为我们提供了 Flask 上路由的 HTTP 身份验证模板。

Flask.g的实现

在直接进行代码实现之前,建议使用专用的 Python 开发环境,可以按如下方式创建该环境:

设置开发环境

可以跳过此步骤,但为每个项目使用专用的开发环境始终是一个好主意,这可以使用 Python 虚拟环境来实现。要创建一个,只需运行以下命令:

python 复制代码
$ mkdir python_web_app; cd python_web_app

这将为项目创建一个专用文件夹,你可以将其命名为任何你想要的名称,然后 cd (更改目录)进入新创建的目录,然后运行以下命令,为你的项目创建虚拟环境。

python 复制代码
$ python3 -m venv venv
$ls

现在让我们激活虚拟环境并开始使用它。

python 复制代码
$ .\venv\Scripts\activate

输出:

现在你已经有了一个可以使用的虚拟环境,所以让我们安装 Flask 和flask_httpauth,它们为我们提供了 HTTP 身份验证功能。

python 复制代码
$ pip install flask flask_httpauth

创建 Flask 应用程序

在此演示中,我们将创建一个 Flask 应用程序,其中包含一些使用 Flask_httpauth 库进行身份验证的路由,但首先,让我们创建一个入门应用程序,创建一个文件名 main.py 并向其中添加以下源代码,

python 复制代码
# Flask应用程序

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return "Hello World"

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

正如你所看到的,这是一个非常简单的 HelloWorld Flask 应用程序,只有一条路线。

输出:

在 Flask 应用程序中使用 flask.g

我们通过创建 HTTPBasicAuth 的身份验证实例启动了 Auth Flask 应用程序的开发,该实例为我们提供了 Flask 应用程序中路由的基本身份验证功能。现在让我们通过添加路由和使用 auth 实例来继续开发应用程序。

python 复制代码
# 在同一个main.py文件中导入flask、flask_httpauth和g
from flask import Flask, g
from flask_httpauth import HTTPBasicAuth

# 创建 flask 应用程序
app = Flask(__name__)

# 创建一个flask_httpauth对象
auth = HTTPBasicAuth()

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

现在,更新的源代码由 2 个路由组成,第一个是根路由,我们将在根路由中登录并将用户存储在"g"变量中,第二个"/current_user"从 g 变量返回对存储用户的访问权限。

源代码包含一个"verify_password"函数,该函数在渲染路由之前对用户进行身份验证,如下所示,如果用户输入正确的凭据,他将被视为经过身份验证的用户,并有权访问指定的路由。

python 复制代码
# 在同一个main.py文件中导入flask、flask_httpauth 和 g
from flask import Flask, g
from flask_httpauth import HTTPBasicAuth

# 创建 flask 应用程序
app = Flask(__name__)

# 创建一个flask_httpauth对象
auth = HTTPBasicAuth()

# 用户、管理员的身份验证路由
@auth.verify_password
def verify_password(username, password):
if username == 'admin' and password == 'password':
	g.user = username
	return True
return False

@app.route('/')
@auth.login_required
def index():
return f'This is an authecated route logged in by user,{g.user}'

# 返回当前登录用户
@app.route('/current_user')
@auth.login_required
def get_current_user():
return f"Current logged in user is {g.user}"

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

输出:

经过身份验证后,用户的用户名将存储在"g.user"变量中,然后在 index() 和 get_current_user 路由中使用。将用户名存储在 g 对象中的好处是,我们可以在任何路由中访问它,而无需将其作为参数传递给函数,因为它在整个请求上下文中都可用。

如你所见,通过"/"路由访问的用户名

输出:

如你所见,通过 /current_user 路由访问的用户名

输出:

总之 flask. g 是一个强大的工具,用于在 Flask 的请求上下文中共享数据。但我们应该谨慎使用它,因为存储太多数据可能会导致 Web 应用程序性能下降。另一件事是在多线程应用程序中应该避免使用"flask.g",因为它不是线程安全的。

相关推荐
GetcharZp3 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
weixin_446260856 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
用户8356290780517 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
用户9931441579847 小时前
微服务框架中获取用户信息
后端
xuanWb7 小时前
手写一个 LLM API 网关:Anthropic 与 OpenAI 协议转换的完整实现
后端
苍何8 小时前
给 Codex 换皮肤这门生意,被我开源了
后端
用户8356290780518 小时前
Python 实现 Excel 命名范围(Named Range)的创建与管理
后端·python
程序员David8 小时前
我让 Claude 从架构文档一路干到代码,踩了三个坑才摸清边界
后端