2012-06-13 19 views
9

Quiero crear un plano; no es un problema con el plan actual que tengo. Puedo hacer esto.Uso de extensiones de matraz en planos de matraz

Pero, digamos que quería usar una extensión de matraz en mi aplicación (¿en mi caso quiero integrar matraz-caché)?

Todo lo que he hecho hasta ahora ha muchos errores:

  • cache = Caché (my_blueprint)

  • importación de caché y varias partes de caché en diferentes formas

por lo algo así como matraz-caché es lo suficientemente simple como para envolver mi aplicación:

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

pero usando esto en un plano o utilizando un plano no entiendo muy bien cómo hacerlo ahora.

EDITAR: la solución menos obvia era copiar desde la extensión y construir mi propia biblioteca para importar en el plano, pero es más trabajo y todavía no he terminado. las extensiones/planos no parecen compatibles desde mi nivel de comprensión en este momento.

Respuesta

32

Con el fin de evitar las importaciones circulares que se desea crear la instancia de memoria caché separada de la instancia de aplicación (es posible que desee considerar el cambio al módulo de fábrica de aplicación, si usted está construyendo algo más complejo).

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) 
+0

Estaba cerca de esto, pero no exactamente en un punto de mis esfuerzos. – blueblank

+3

Usando blueprints y CACHE_TYPE = 'filesystem' solo funcionó con cache.init_app (app, config = app.config) –

+0

No puedo usar el tiempo de impresión como sugiere, y este código se ejecuta para mí. fecha y hora de importación ahora = datetime.datetime.now() \t horas = ahora.hora \t minutos = now.minute \t segundo = now.second \t de impresión "se trata de tiempo de caché:% s-% s-% s "% (horas, minutos, segundos) – gacon

0

Lo único que necesita acceder a la aplicación es app -instance para crear un cache.

Supongamos que su código: cache = Cache(app) está en foo.py. Pero desea utilizar el caché en bar.py que utiliza un Blueprint para registrar las rutas.

foo.py:

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

from bar import mod 
app.register_blueprint(mod) 

Lo único que tiene que hacer en bar.py está importando el cache de foo.py y utilizarla:

bar.py:

from foo import chache 

mod = Blueprint(...) 


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

Flask Cache Docs y Examples

EDIT: El ejemplo anterior tiene un problema con importaciones circiular. El camino a seguir aquí es independiente de la aplicación de la caché:

paquete/__ init __.py:

app = Flask(__name__) 

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

paquete/cache.py:

from flask.ext.cache import Cache 

from pack import app 

cache = Cache(app) 

paquete/vistas/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()) 
+0

yo probamos este principio, pero recibe un error; e intenté nuevamente, es una importación circular. – blueblank

+0

@blueblank: ¿Está importando aplicaciones en su archivo de planos o está utilizando Flask import current_app? –

+0

Sí, no pensé en eso, lo siento. Normalmente tengo un módulo con '__init __. Py' que contiene la aplicación y mis' view-functions' en la carpeta 'view'. Pero creo que entendiste la idea. – dav1d

Cuestiones relacionadas