zoukankan      html  css  js  c++  java
  • 应用上下文和请求上下文

    应用上下文分别为: current_app, g。 分别是当前的应用实例和请求时用于临时存储数据的对象

    请求上下文分别为: request, session。 分别是封装客户端发送所有信息的对象和跨请求之存储的值。

    主模块代码

    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        user_agent = request.headers.get("User-Agent")
        return "<p>Your browser is {}</p>".format(user_agent)
    
    @app.route("/user/<name>")
    def user(name):
        return "<h1> Hello, {} !</h1>".format(name)
    
    
    if __name__ == '__main__':
        app.run()
    

      

    原理: Flask在分派请求之前先推送应用上下文和请求上下文, 此时就可以使用上述的四个对象,  请求处理完成后会将其删除, 便不能再使用上述四个对象。

    正常的情况应该是这样:

    错误示例:

    D:flaskStudy>set FLASK_APP=flaskStudy.py

    D:flaskStudy>flask shell
    App: flaskStudy [production]
    Instance: D:flaskStudyinstance
    >>> from flaskStudy import app
    >>> from flask import current_app
    >>> current_app.name   # 此处应该报错, 因为没有推送应用上下文, 但现在却成功了。
    'flaskStudy'

    正确示例:

    D:flaskStudy>flask shell
    App: flaskStudy [production]
    Instance: D:flaskStudyinstance
    >>> from flaskStudy import app
    >>> from flask import current_app
    >>> app_ctx = app.app_context()  # 加载应用上下文
    >>> app_ctx.push()  # 推送应用上下文件
    >>> current_app.name  # 使用应用上下文
    'flaskStudy'
    >>> app_ctx.pop()  # 收回应用上下文

    按理说正确的做法应该是第二种, 但第一种也成功了, 似乎不需要推送上下文也可以使用上下文对象了。

  • 相关阅读:
    GoldenGate HANDLECOLLISIONS参数使用说明
    GoldenGate for bigdata 12.3.2.1版本新特性
    使用GoldenGate EVENTACTIONS执行数据的实时触发和定制化
    基于Docker的GoldenGate部署
    Redis热点数据预写方案
    Redis缓存和数据库双写一致方案
    Redis主从复制原理和高可用方案
    Redis的并发竞争如何解决?如何保证并发写的有序?
    Redis 的单线程模型
    Nginx系列之6:重要模块
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/12975189.html
Copyright © 2011-2022 走看看