18

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

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

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

  • 缓存 = 缓存(我的蓝图)

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

所以像烧瓶缓存这样的东西很简单,可以包裹我的应用程序:

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

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

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

4

2 回答 2

52

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

缓存.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")

应用程序.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)
于 2012-06-14T05:15:10.530 回答
0

应用程序唯一需要访问的是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就是导入cachefromfoo.py并使用它:

酒吧.py:

from foo import chache

mod = Blueprint(...)


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

Flask 缓存文档示例

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

包/__初始化__.py:

app = Flask(__name__)

from pack.views.general import mod
app.register_blueprint(mod)

包/缓存.py:

from flask.ext.cache import Cache

from pack import app

cache = Cache(app)

包/视图/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())
于 2012-06-13T17:56:30.490 回答