1.上下文概念与Flask上下文对象分类
Flask上下文
上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情
Flask上下文对象分类: (1).请求上下文: 1).request 2).session
(2).应用上下文: 1).current_app 2).g对象
2.请求上下文之request与session
请求上下文: request与session
request对象: 封装了HTTP请求的内容, 针对的是HTTP请求. 请求的数据封装在request对象中, 比如查询参数, 文件数据等
session:session用来记录请求会话中的信息, 针对的是用户信息.
3.应用上下文current_app与g对象
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'
4.手动开启上下文
手动开启上下文:
在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)
...
5.蓝图
蓝图概念:
在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()