执行上下文:即语境,语意,在程序中可以理解为在代码执行到某一行时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。
Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息[变量、函数、类与对象等信息]。
Flask中有两种上下文,请求上下文(request context)和应用上下文(application context)。
-
application 指的就是当你调用
app = Flask(__name__)
创建的这个对象app
; -
request 指的是每次
http
请求发生时,WSGI server
(比如gunicorn/uwsgi)调用Flask.__call__()
之后,在Flask
对象内部创建的Request
对象; -
application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
-
application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request
请求上下文(request context)
思考:在视图函数中,如何取到当前请求的相关数据?比如:请求地址,请求方式,cookie等等
在 flask 中,可以直接在视图函数中使用 request 这个对象进行获取相关数据,而 request 就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request、session
-
request
-
封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
-
-
session
-
用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。
-
请求上下文提供的变量/属性/方法/函数/类与对象,只能在视图中或者被视图调用的地方使用
应用上下文(application context)
它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中操作当前falsk应用对象 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的flask应用相关的信息,它是伴 request 而生,随 request 而灭的。
应用上下文对象有:current_app,g
current_app
应用程序上下文,用于存储应用实例对象中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:
-
应用的启动脚本是哪个文件,启动时指定了哪些参数
-
加载了哪些配置文件,导入了哪些配置
-
连接了哪个数据库
-
有哪些可以调用的工具类、常量
-
当前flask应用在哪个机器上,哪个IP上运行,内存多大
示例代码:
from flask import Flask,request,session,current_app,g # 初始化 app = Flask(import_name=__name__) # 声明和加载配置 class Config(): DEBUG = True app.config.from_object(Config) # 编写路由视图 @app.route(rule='/') def index(): # 应用上下文提供给我们使用的变量,也是只能在视图或者被视图调用的地方进行使用, # 但是应用上下文的所有数据来源于于app,每个视图中的应用上下文基本一样 print(current_app.config) # 获取当前项目的所有配置信息 print(current_app.url_map) # 获取当前项目的所有路由信息 return "<h1>hello world!</h1>" if __name__ == '__main__': # 运行flask app.run(host="0.0.0.0")