Являются ли глобальные переменные хорошей идеей для использования на веб-сайте колб? - PullRequest
0 голосов
/ 03 апреля 2019

Существует веб-сайт фляги, который получает доступ к некоторым данным, хранящимся в базе данных.Данные относятся к более чем одному шаблону веб-сайта, и я бы предпочел, чтобы к базе данных не обращались снова и снова за той же самой информацией, которую пользователь посещает шаблоны веб-сайта, а скорее для хранения в переменных.Сессия не очень хорошая идея из-за размера данных.Мне интересно, было бы хорошей идеей использовать глобальные переменные для этой цели.Доступ к базе данных и присвоение данных глобальным переменным, откуда они будут доступны через шаблоны веб-сайта в течение всего сеанса.Я был бы признателен, если бы знал, является ли это правильным способом достижения этого, или есть недостатки в том, что доступ к базе данных несколько раз при необходимости был бы лучшим вариантом.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Попробуйте использовать инструменты ORM, такие как sQLAlchemy, он сделает большую часть тяжелой работы за вас.

https://www.sqlalchemy.org/

Примеры, доступные здесь

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

0 голосов
/ 04 апреля 2019

Если ваш код не использует sqlalchemy и вы не хотите выполнять тяжелую работу по переопределению кода по разным причинам, вы можете заключить код доступа к базе данных в класс и присоединить его к экземпляру приложения фляги.

app.db = DBAccessClass()

Затем через код, который вы вызываете в экземпляре, прикрепленном к приложению с колбой.Это не решит вашу проблему с помощью нескольких обращений к БД для одних и тех же данных, которые могут быть кэшированы.

Затем вы можете использовать класс аннотаций, который бы реализовывал стратегию кэширования для вашего 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...