无法在请求中访问g对象上的属性集

时间:2015-06-04 19:08:11

标签: python flask

我想使用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'

调试器显示dsNone而不是DataIO的实例。为什么即使我在None上定义了g,我也会得到g?我应该如何正确地将其添加到{{1}}以便视图可以获得它?

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或查看现有扩展程序。