全局变量对Flask网站应用程序来说是个好主意吗?

时间:2019-04-03 20:05:25

标签: python postgresql jinja2

有一个烧瓶网站,可以访问数据库中存储的某些数据。数据与网站的多个模板有关,我希望不要一次又一次地访问与用户访问网站模板相同的信息的数据库,而是将数据库存储在变量中。由于数据量大,会话不是一个好主意。我想知道是否为此目的使用全局变量是一个好主意。访问一次数据库并将数据分配给全局变量,只要会话持续进行,就可以从该位置通过网站的模板从那里获得数据。我将不胜感激,如果这是实现此目标的正确方法,或者存在一些弊端,那就是如果需要,可以多次访问数据库,这是一个更好的选择。预先谢谢你。

2 个答案:

答案 0 :(得分:1)

尝试使用sQLAlchemy之类的ORM工具,它可以为您完成大部分繁重的工作。

https://www.sqlalchemy.org/

此处提供示例

https://realpython.com/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/

答案 1 :(得分:0)

如果您的代码未使用sqlalchemy,并且由于各种原因您不想繁琐地重新编写代码,则可以将数据库访问代码包装到一个类中并将其附加到flask应用程序实例。

app.db = DBAccessClass()

然后,通过代码调用附加到flask应用程序的实例。 通过对可缓存的相同数据多次调用数据库,不会解决您的问题。

然后,您可以使用一个注释类,该类将为您的DBAccessClass实现缓存策略,这是一个非常简单的示例:

from functools import wraps, update_wrapper


class cache(object):


    def __init__(self):
        self.named_caches = {}


    def __call__(self, f):

        @wraps(f)
        def decorated(*args, **kwargs):
            key = f.__name__
            if key not in self.named_caches:
                self.named_caches[key] = f(*args, **kwargs)
            return self.named_caches[key]

        return update_wrapper(decorated, f)


cached = cache()


class MyDBAccessClass(object):

    @cached
    def get_some_data(self):
       data = query_db()
       return data

这可能是一个短期解决方案,强烈鼓励您考虑使用sQLAlchemy。