【问题标题】:Using flask extensions in flask blueprints在烧瓶蓝图中使用烧瓶扩展
【发布时间】:2012-06-16 17:21:15
【问题描述】:

我想创建一个蓝图;我目前的蓝图不是问题。我可以做到。

但是,假设我想在我的应用程序中使用烧瓶扩展(对于我的情况,我想集成烧瓶缓存)?

到目前为止我所做的一切都出错了:

  • 缓存 = 缓存(my_blueprint)

  • 以各种形式导入缓存和缓存的各个部分

所以像 flask-cache 这样的东西很简单,可以包裹我的应用程序:

from flask.ext.cache import Cache
cache = Cache(app)

但是在蓝图中使用它或与蓝图一起使用我现在不太明白。

编辑:不太明显的解决方案是从扩展中获取并构建我自己的库以导入蓝图,但这是更多的工作,我还没有完成。从我目前的理解水平来看,扩展/蓝图似乎不兼容。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    为了避免循环导入,您需要创建与应用程序实例分开的缓存实例(如果您正在构建更复杂的东西,您可能需要考虑切换到应用工厂模块)。

    cache.py

    from flask_cache import Cache
    
    cache = Cache()
    

    foo.py

    from flask import Blueprint
    from cache import cache
    
    mod = Blueprint(...)
    
    @mod.route("/")
    @cache.cached(timeout=50)
    def index():
        return datetime.now().strfmtime("%Y-%m-%d %H:%M:%S")
    

    app.py

    from flask import Flask
    from yourapp.cache import cache
    from yourapp.foo import mod
    
    app = Flask("yourapp")
    
    # ... snip ...
    
    cache.init_app(app)
    
    # ... snip ...
    
    app.register_blueprint(mod)
    

    【讨论】:

    • 我已经接近了这一点,但并不是我努力的某一时刻。
    • 使用蓝图和 CACHE_TYPE = 'filesystem' 仅适用于 cache.init_app(app, config=app.config)
    • 我只是不能像你建议的那样使用打印时间,这段代码为我运行。 import datetime now =datetime.datetime.now() hours = now.hour minutes = now.minute second = now.second print "这是缓存时间: %s-%s-%s" % (小时, 分钟, 秒)
    • 我注意到@cache.cached() 或@cache.memoize() 必须直接 在def index(): 行之上(即你不能有@cache .cached() 然后 @mod.route('/') 然后 def index() - 是因为装饰器的评估顺序吗?
    • 正确 - route 使用 Flask 注册函数,并且由于缓存返回 不同 函数,如果您不将装饰路线的结果提供给 Flask,它将调用未装饰的
    【解决方案2】:

    应用程序唯一需要访问的是app-instance 以创建cache

    假设您的代码:cache = Cache(app)foo.py 中。但是您想使用 bar.py 中的缓存,它使用蓝图来注册路由。

    foo.py:

    from flask.ext.cache import Cache
    cache = Cache(app)
    
    from bar import mod
    app.register_blueprint(mod)
    

    您在bar.py 中唯一需要做的就是从foo.py 导入cache 并使用它:

    bar.py:

    from foo import chache
    
    mod = Blueprint(...)
    
    
    @mod.route('/')
    @cache.cached(timeout=50)
    def index():
        return str(datetime.now())
    

    Flask Cache DocsExamples

    编辑:上面的例子有一个循环导入的问题。这里的方法是将应用程序与缓存分开:

    pack/__init__.py:

    app = Flask(__name__)
    
    from pack.views.general import mod
    app.register_blueprint(mod)
    

    pack/cache.py:

    from flask.ext.cache import Cache
    
    from pack import app
    
    cache = Cache(app)
    

    pack/views/general.py:

    from flask import Blueprint
    from pack.chache import chache
    
    mod = Blueprint(...)
    
    
    @mod.route('/')
    @cache.cached(timeout=50)
    def index():
        return str(datetime.now())
    

    【讨论】:

    • 我先尝试了这个但收到错误;并再次尝试——这是一个循环导入。
    • @blueblank:您是在蓝图文件中导入应用程序,还是使用 from Flask import current_app?
    • 是的,我没有想到这一点,对此感到抱歉。通常我有一个带有__init__.py 的模块,其中包含应用程序和view 文件夹中的view-functions。但我想你明白了。
    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多