胖蔡说技术
随便扯扯

Flask 使用Context上下文

Context上下文用于串联整个Web开发编程,用于在服务器端获取应用以及请求相关信息。FlaskContext上下文一般有三类:会话上下文Session Context)、应用全局上下文Application Context)、请求上下文Request Context)。

  • Seesion Context:会话上下文,是Web服务基于Cookie对象提供了同一个客户端在多次请求之间共享信息的方式。
  • Application Context:应用全局上下文,提供了在一次请求的多个处理函数中共享信息的方式。
  • Request Context:请求上下文,是Web服务器管理单次用户请求的环境对象,用于处理客户端向Web服务器发送的数据。

会话上下文(Session Context)

会话(Session)是一种客户端与服务端保持状态连接的解决方案。在服务端会话尚希文是用于实现这种解决方案的存储结构,每个用户连接得到不同的会话,即会话与用户是一对一关系。会话在用户进入网站时由服务器自动产生,并在用户正常离开时释放。同一用户的多个请求共享一个会话。会话上下文通常是通过Cookie实现,其原理如下:

图 1.1 session会话原理

代码示例如下:

from flask import Flask,session
from datetime import datetime


app = Flask(__name__)

app.secret_key = 'FLASK_SECRET_KEY'


@app.route('/write_session')
def writeSession():
    session['key_time'] = datetime.now(sseme('%Y-%m-%d %H:%M:%S')
    return session['key_time'] #返回当前时间

@app.route('/read_session')
def readSession():
    return session.get('key_time') #获得上次调用wirteSession时写入时间,并返回

应用全局上下文(Application Context)

应用上下文是Flask在每次请求上下文(Request Context)伴随而生,它的典型应用场景是缓存一些在发生请求之前要使用的资源,如生成数据库连接和缓存一些对象。常用应用上下文变量有如下两个:

flask.current_app

当前app实例对象,用于存储英语红示例对象中的变量,代码示例如下:

from flask import Flask, request, session, current_app, g
 
app = Flask(import_name=__name__)
 
 
# 声明和加载配置
class Config():
    DEBUG = True
 
 
app.config.from_object(Config)
 
 
# 编写路由视图
@app.route(rule='/')
def index():
    # 应用上下文提供给我们使用的变量,也是只能在视图或者被视图调用的地方进行使用,
    # 但是应用上下文的所有数据来源于app,每个视图中的应用上下文基本一样
    print(current_app.config)  # 获取当前项目的所有配置信息
    print(current_app.url_map)  # 获取当前项目的所有路由信息
    return "hello world!"
 
if __name__ == '__main__':
    app.run()
 

flask.g

处理请求时用作临时存储的对象,我们可以通过它传递一些数据,g 保存的是当前请求的全局变量,不同的请求会有不同的全局变量。代码示例如下:

from flask import Flask, request, session, current_app, g
 
app = Flask(import_name=__name__)

 
# 声明和加载配置
class Config():
    DEBUG = True
 
app.config.from_object(Config)
 
@app.before_request
def before_request():
    g.name = "root"
 
def get_two_func():
    name = g.name
    print("g.name=%s" % name)  # g.name=root
 
def get_one_func():
    get_two_func()
 
# 编写路由视图
@app.route(rule='/')
def index():
    # 应用上下文提供给我们使用的变量,也是只能在视图或者被视图调用的地方进行使用,
    # 但是应用上下文的所有数据来源于app,每个视图中的应用上下文基本一样
    get_one_func()
 
    return "hello world!"
 
if __name__ == '__main__':
    app.run()
 

请求上下文(Request Context)

请求上下文主要单次请求获取的环境对象,对象包含数据如:URL参数、Form表单、Cookie、请求头数据等。这里我们来看下请求上下文变量flask.request访问属性:

  • form:获取form提交表单数据。
  • method:获取请求方法。
  • is_xhr:判断客户端是否通过JavaScript的XmlHttpRequest方法提交本次请求,值为Ture 或 False。
  • json:若客户端提交的是JSON数据,可通过本方法进行解析。
  • headers:访问、获取从客户端传递的请求头数据。
  • values:form和args的结果,既包括表单数据,也包括URL查询参数。
  • args:访问URL中的参数。files:请求提交的文件信息。
  • files:请求提交的文件信息。
  • on_json_loading_failed(e):可以对本属性赋予一个回调函数,当解析JSON数据失败时会调用该函数。
  • cookies:访问从客户端传送的Cookie,数据为字典键值对。
  • data:当以MIMETYPE类型提交数据时,data属性用于以字符串形式保存所提交的数据。

代码示例如下:

from flask import request, url_for,redirect

@app.route('/redirect_url')
def redirect_url():
    next = request.args.get('next') or url_for('index')
    return redirect(next)

@app.route('/echo_url')
def echo_url():
    return request.base_url
赞(0) 打赏
转载请附上原文出处链接:胖蔡叨叨叨 » Flask 使用Context上下文
分享到: 更多 (0)

请小编喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏