V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wisej
V2EX  ›  Flask

请教一些关于 Flask 应用上下文 的问题

  •  
  •   wisej · 2017-08-24 21:59:22 +08:00 · 3237 次点击
    这是一个创建于 2426 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查阅一番资料后,大概了解了下应用上下文的机制。

    http://flask.pocoo.org/docs/0.12/appcontext/#app-context 中,有这么一句话 :"The context is typically used to cache resources that need to be created on a per-request or usage case." 然后举例将一个数据库的连接( db )绑定到 g 上,又通过 @app.teardown_appcontext 来关闭连接 db。既然 应用上下文 会随每个请求的结束而销毁,那么 db 不就会在每次请求的开始前创建连接,又在结束后关闭连接么?完全谈不上缓存或者复用啊。

    1.g 的生命周期明明就一个请求的开始和结束,为什么能说用来cache resources

    2.我能不能在应用上下文结束时不关闭连接,这样下次有请求来不就不用再去创建连接,达到复用么?(弊端可能就是一段时间后连接可能会失效?)

    12 条回复    2017-08-25 01:02:44 +08:00
    SErHo
        1
    SErHo  
       2017-08-24 23:03:20 +08:00 via iPhone   ❤️ 1
    使用连接池或者全局的连接对象吧
    hxndg
        2
    hxndg  
       2017-08-24 23:17:05 +08:00   ❤️ 1
    我记得原先有段时间我也纠结这个。。。
    g 就是请求上下文开始结束时生存,不太明白到底是 cache 什么。
    你看看这个有没有用?有点迷惑应用上下文和连接有直接关系么?
    https://blog.tonyseek.com/post/the-context-mechanism-of-flask/
    hxndg
        3
    hxndg  
       2017-08-24 23:20:13 +08:00
    我又想了一下,g 应该说是生存在应用上下文,但是跟随每个请求上下文,这应该是它说 cache 的意思?
    每个连接都会压一个应用上下文?所以应用上下文和连接相对独立?可能你得改改底下的代码,好吧,我也有点蒙了
    skywatcher
        4
    skywatcher  
       2017-08-24 23:31:18 +08:00   ❤️ 1
    flask.g
    Just store on this whatever you want. For example a database connection or the user that is currently logged in.

    Starting with Flask 0.10 this is stored on the application context and no longer on the request context which means it becomes available if only the application context is bound and not yet a request. This is especially useful when combined with the Faking Resources and Context pattern for testing.

    ------------
    http://flask.pocoo.org/docs/0.10/api/#application-globals
    TJT
        5
    TJT  
       2017-08-24 23:51:13 +08:00
    我用来缓存用户信息,代码在不同地方都会查询用户信息,用 g 就可以避免一次请求重复查询几次用户信息,也不用把用户信息传来传去。
    wisej
        6
    wisej  
    OP
       2017-08-24 23:51:21 +08:00
    @skywatcher 这句话,“ To share data that is valid for one request only from one function to another,”。我不是很明白,一个请求不是就对应一个视图函数么,那为什么会 from one function to another ?除了视图函数里含有 redirect 的情况
    wwqgtxx
        7
    wwqgtxx  
       2017-08-24 23:54:26 +08:00 via iPhone
    @wisej 不是还有各种钩子么,比如 app.before_request 之类的
    rogwan
        8
    rogwan  
       2017-08-24 23:57:31 +08:00 via Android
    还有个 app context 的 push,也比较容易搞混。
    hxndg
        9
    hxndg  
       2017-08-25 00:03:38 +08:00
    @wisej 我一直理解的一个 request 对应的实际上是一个 app,也就是你开始定义的那个 app,而不是对应的一个 function。。。
    wisej
        10
    wisej  
    OP
       2017-08-25 00:19:52 +08:00
    @hxndg 一样吧。一个 request 交由一个 app 实例处理,最后实质上不就是相当于执行路由匹配到的视图函数么。所以我就那么说了..
    billlee
        11
    billlee  
       2017-08-25 00:37:32 +08:00   ❤️ 1
    @wisej #6 复杂的应用,一个请求进来后,处理函数可能一个个嵌套了好多层,把 request, g 这些搞成 context-local variable, 就不需要再把这些东西一层层用函数参数传递
    wisej
        12
    wisej  
    OP
       2017-08-25 01:02:44 +08:00
    @billlee 了解了,感谢解释
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3395 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:34 · PVG 20:34 · LAX 05:34 · JFK 08:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.