一次完整的网络请求流程类似于一次网购流程:
一,客户端发送一次请求,假如请求信息是”一瓶500ml可乐“,flask中请求对象收到这个信息。
二,flask收到请求信息,交给对应的视图函数,视图函数去数据库取”一瓶500ml可乐“
三,视图函数将“一瓶500ml可乐”,交给response, response按照网络协议,返回给客户端。流程结束。
在第一步中,要想让视图函数能知道每次请求的内容是什么,一个方式是将请求作为参数传给视图函数。不过这会导致每个视图函数都会增加一个参数。除了访问请求对象,还要访问其他对象,参数会越来越多,视图函数会很混乱。flask使用上下文临时变量,让请求对象变成全局变量,全局可访问。这样就不用每个视图函数都带一个必须的请求参数了。
flask有四个常用的上下文全局变量:
变量名 | 上下文 | 说明 |
current_app | 程序上下文 | 当前激活程序的程序实例,功能类似于app |
g | 程序上下文 | 处理请求时用作临时存储的对象 |
request | 请求上下文 | 请求对象,封装了客户端发出的http请求中内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的值得字典。比如用户名,账号 |
举例:
请求上下文request:
from flask import request @app.route("/") def index(): user_agent=request.headers.get("User-Agent") return "<p> Your browser is %s</p>"% user_agent
请求上下文 session:
from flask import request,session @app.route("/") def index(): user_agent=request.headers.get("User-Agent") user_name=session.get("user_info").get("loginname") return "<p> Your browser is %s</p>"% user_agent
程序上下文 current_app:
from flask import request,session,current_app @app.route("/") def index(): user_agent=request.headers.get("User-Agent") user_name=session.get("user_info").get("loginname") current_app.logger.info("get user.name") # 如果将js变量初始化赋值给了app,可通过下列方式取出 js_address=current_app.config.get("js_address") return "<p> Your browser is %s</p>"% user_agent