赞
踩
Flask上下文
上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情
Flask上下文对象分类: (1).请求上下文: 1).request 2).session
(2).应用上下文: 1).current_app 2).g对象
请求上下文: request与session
request对象: 封装了HTTP请求的内容, 针对的是HTTP请求. 请求的数据封装在request对象中, 比如查询参数, 文件数据等
session:session用来记录请求会话中的信息, 针对的是用户信息.
current_app对象:
current_app事实上是Flask实例的代理, 由于一个项目只能有一个app实例, 在其他地方使用app需要导入, 不方便使用, current_app就是APP的全局代理. 在代码不方便操作flask的APP对象时, 可以操作current_app就等价于操作APP实例.
current_app用于存储应用程序中的变量:
- 应用的启动脚本是哪个文件, 启动时指定了哪些参数
- 加载了哪些配置文件, 导入了哪些配置
- 连接了哪个数据库
- 有哪些public的工具类, 常量
- 应用跑在哪个机器上, IP是多少,内存多大等等信息
g对象:
g对象作为flask程序全局的一个临时变量, 充当中间媒介的作用, 我们可以通过它在一次请求调用的多个函数间传递一些数据, 相当与一个共享的数据容器, 每次请求都会重设这个变量.
g对象实例:
- from flask import Flask, g
-
- app = Flask(__name__)
-
- def db_query():
- user_id = g.user_id
- user_name = g.user_name
- print('user_id={} user_name={}'.format(user_id, user_name))
-
- @app.route('/')
- def get_user_profile():
- g.user_id = 131
- g.user_name = 'Jeremy'
- db_query()
- return 'hello world'
手动开启上下文:
在flask程序未运行的情况下, 调试代码或进行测试, 同样需要使用current_app, g, request这些对象, 但程序未运行, 所以无法使用, 此时需要手动开启上下文.
app_context:
app_context为我们提供了应用上下文环境, 允许我们在外部使用应用上下文current_app, g. 可以通过with语句进行使用:
- >>> from flask import Flask
- >>> app = Flask('')
- >>> app.redis_cli = 'redis client'
- >>>
- >>> from flask import current_app
- >>> current_app.redis_cli # 错误,没有上下文环境
- 报错
- >>> with app.app_context(): # 借助with语句使用app_context创建应用上下文
- ... print(current_app.redis_cli)
- ...
- redis client
-
- # request_context
request_context为我们提供了请求上下文环境,允许我们在外部使用请求上下文request、session可以通过with语句进行使用
- >>> from flask import Flask
- >>> app = Flask('')
- >>> request.args # 错误,没有上下文环境
- 报错
- >>> environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'itcast server', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'} # 模拟解析客户端请求之后的wsgi字典数据
- >>> with app.request_context(environ): # 借助with语句使用request_context创建请求上下文
- ... print(request.path)
- ...
蓝图概念:
在Flask中, 蓝图(blueprint)是一种用来扩展已有Flask应用结构的方式, 蓝图提供了一种把功能类似的视图函数组合在一起的方式, 通过这种方式, 开发者能够把他们的应用拆分成不同的组件. 在我们的架构中, 蓝图的作用类似于控制器(controller).
蓝图实现:
0.导包
1.创建蓝图
2.添加蓝图路由
2.注册蓝图
- # 1创建蓝图 & 2添加蓝图路由
- from flask import Blueprint
-
- # 创建蓝图对象
- users_bp = Blueprint('users', __name__)
-
- # 添加蓝图路由
- @users_bp.route('/index')
- def indext():
- return 'users bp response'
- # 3.注册蓝图
- from flask import Flask
- # 导入蓝图
- from apps.users_bp import users_bp
-
- # 创建Flask实例
- app = Flask(__name__)
- # 注册蓝图
- app.register_blueprint(users_bp)
-
- if __name__ == '__main__':
- # 查看路由映射
- print(app.url_map)
- app.run()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。