在 Flask 蓝图中使用 Flask 扩展

21

我想创建一个蓝图;并不是我当前拥有的蓝图出现了问题。这是我可以做到的。

但是,如果我想在我的应用程序中使用flask扩展(例如我想集成flask-Cache),该怎么办?

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

  • cache = Cache(my_blueprint)

  • 导入Cache和Cache的各种部分

因此,像flask-cache这样的东西就足以围绕我的应用程序进行包装:

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

但是在蓝图中使用它或与蓝图一起使用,我现在还不太理解。

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

2个回答

61
为了避免循环导入,您需要将缓存实例与应用程序实例分开创建(如果您正在构建更复杂的东西,则可以考虑切换到应用工厂模块)。 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)

在我的努力中,有一段时间我接近了这个目标,但并不完全符合。 - blueblank
3
仅使用蓝图和CACHE_TYPE = 'filesystem'只有在cache.init_app(app,config = app.config)中使用才能起作用。 - Jonathan Simon Prates
我只是不能像你建议的那样使用print time,但这段代码对我来说可以运行。导入datetime模块后,获取当前时间并分别获取小时、分钟和秒数,最后使用格式化字符串输出缓存时间:"this is cache time: %s-%s-%s" % (hours, minutes, second)。 - gacon
我注意到@cache.cached()或@cache.memoize()必须直接放在def index():行的上方(即您不能在@cache.cached(),然后是@mod.route('/'),然后是def index() - 这是因为装饰器的评估顺序吗?) - Jakub P.
正确 - route 用于在 Flask 中注册函数,由于缓存返回的是一个不同的函数,如果您没有将装饰路由的结果提供给 Flask,则它将调用未装饰的函数。 - Sean Vieira
flask.ext.cache 已经弃用,请使用 flask_cache。 - Kalimantan

0
应用程序唯一需要访问的是app实例,以创建一个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缓存文档示例

编辑:上面的示例存在循环导入的问题。解决方法是将应用程序与缓存分开:

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
@blueblank:你是在蓝图文件中导入应用程序,还是使用了from Flask import current_app? - user742071
是的,我没有考虑到那个,对此感到抱歉。通常我会有一个包含应用程序和我的“视图函数”文件夹view__init__.py模块。但我想你已经明白了。 - dav1d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接