Flask 中的 Flask.g 模块是什么
G 模块或 Flask.g 由 Flask 提供,开发人员在开发 Flask 应用程序时将其用作全局对象,以在 Flask 应用程序或单个请求的上下文中存储和访问数据或任何全局变量。
何时应使用"flask.g"
正如我们在简介中讨论的那样,Flask 提供的 g 变量可以用作 Flask 应用中的路由请求的上下文。但这里有一些应该使用 flask.g
的常见场景,
- 你可以使用flask.g 来存储你需要访问数据库的每个请求的连接或会话数据,以便在你的Flask 应用程序连接到某个数据库时随时可用。
- 我们需要共享某些配置变量作为请求的一部分的情况可能是另一个用例。
- 如果你想保留在许多用户信息请求中加载的某些用户数据或密码,"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",因为它不是线程安全的。