在烧瓶蓝图中使用烧瓶扩展

时间:2012-06-13 17:25:47

标签: python flask

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

但是,我想在我的应用程序中使用烧瓶扩展(对于我的情况,我想集成flask-Cache)?

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

  • cache = Cache(my_blueprint)

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

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

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

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

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

2 个答案:

答案 0 :(得分:39)

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

<强> 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)

答案 1 :(得分: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中唯一需要做的就是从cache导入foo.py并使用它:

<强> bar.py:

from foo import chache

mod = Blueprint(...)


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

Flask Cache DocsExamples

编辑:以上示例存在圆周导入问题。这里的方法是将应用程序与缓存分开:

<强>包/ __ 初始化 __ PY:

app = Flask(__name__)

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

<强>包/ cache.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())