Flask上下文概念和蓝图的使用

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()


 
 
      

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_ang__ang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值