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

2024-04-28 13:12:05 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个flask网站可以访问存储在数据库中的一些数据。这些数据与网站的多个模板相关,我更希望数据库不要因为用户访问网站模板时的相同信息而被反复访问,而是存储在变量中。由于数据的大小,会话不是一个好主意。我想知道使用全局变量是否是个好主意。一次访问数据库,并将数据分配给全局变量,在会话持续的时间内,通过网站的模板可以从中获取数据。我很想知道这是否是实现它的正确方法,或者如果需要,多次访问数据库是一个更好的选择。先谢谢你。你知道吗


Tags: 数据方法用户模板信息数据库flask网站
2条回答

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

https://www.sqlalchemy.org/

此处提供示例

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

如果您的代码没有使用sqlalchemy,并且由于各种原因不想对代码进行繁重的重构,那么您可以将数据库访问代码包装到一个类中,并将其附加到flask应用程序实例。你知道吗

app.db = DBAccessClass()

然后通过代码调用连接到flask应用程序的实例。 对于可以缓存的相同数据,对DB进行多次调用并不能解决问题。你知道吗

然后可以使用注释类来实现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。你知道吗

相关问题 更多 >