flask中的上下文


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对象
2.应用上下文: 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)
...  

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM