我想使用g
来存储我的DataIO
类的实例。然后在视图中,我可以使用g.data_service
来获取实例。
app/__init__.py
from flask import Flask, g
from data_io import DataIO
myapp = Flask(__name__)
import app.views
with myapp.app_context():
g.data_service = DataIO() # DataIO() is my data access class
app/views.py
:
from app import myapp
from flask import render_template, request, g
@myapp.route('/panel', methods=['POST', 'GET'])
def get_data_by_query():
ds = getattr(g, 'data_service', None) # ds is None
full_list = ds.get_case_list()
当我转到“/ panel”时,它会引发异常:
AttributeError: 'NoneType' object has no attribute 'get_case_list'
调试器显示ds
是None
而不是DataIO
的实例。为什么即使我在None
上定义了g
,我也会得到g
?我应该如何正确地将其添加到{{1}}以便视图可以获得它?
答案 0 :(得分:4)
g
命名空间仅对单个应用程序上下文持久存在。因此,只要with
块关闭,上下文就会消失,因此当请求进入时,它在下一个上下文中不可用。
也许您正在寻找before_request
,它会在每次请求之前注册要运行的函数。
from flask import g
@app.before_request
def connect_data():
# an instance is created before every request
g.data_service = DataIO()
或许你想要一个扩展,每个应用程序都有一定数量的持久状态。
from flask import current_app
class DataIOExtension(object):
def __init__(self, app=None):
self._app_cache = {}
if app is not None:
self.init_app(app)
def init_app(self, app):
# an instance is created once per app
self._app_cache[app] = DataIO()
@property
def client(self):
return self._app_cache[current_app._get_current_object()]
def __getattr__(self, name):
return getattr(self.client, name)
data_service = DataIOExtension()
data_service.init_app(app)
@app.route('/hello')
def hello():
full_list = data_service.get_case_list()
我真的不知道你的DataIO
类的行为,所以这只是一个例子。有关详细信息,请参阅Flask docs on extension development或查看现有扩展程序。