Недостатки использования статического класса как простого, доступного только для чтения кэша в приложении фляги? - PullRequest
0 голосов
/ 02 октября 2019

Я создаю API для мобильного приложения для путешествий, используя flask. Моему приложению требуются данные о странах мира - они, очевидно, очень статичны и полностью читаются только с точки зрения пользователя.

Для многих пользовательских запросов требуется информация о стране для дополнения данных, отправляемых из внешнего интерфейса (связанных с их запросом). через 3-х символьный код страны). Вместо того, чтобы каждый раз запрашивать базу данных, имеет смысл кэшировать статические данные.

Мне известны решения для кэширования (например, flask cache), но во избежание введения зависимостей для простогозадача (а также для моего собственного понимания), есть ли проблема с моим текущим решением с использованием статического класса (ниже)? Будет ли эта проблема возникать в prod с несколькими потоками / запросами?

CountriesCache класс использует переменные класса и статические методы для кэширования и возврата стран (Country - это класс sqlalchemy ORM).

class CountriesCache(object):

    _countries = None

    @classmethod
    def cache_countries(cls):
        # tuple so immutable 
        cls._countries = tuple(Country.get_all())

    @classmethod
    def get_by_code(cls, code):

        if not cls._countries:
            cls.cache_countries()

        return next((c for c in cls._countries if c.code == code), None) 

На моей фабрике create_app я делаю

def create_app():

    app = Flask(__name__)

    # more set up here...

    CountriesCache.cache_countries()
    return app

Затем я использую кэш в маршруте API, например

from app.utils import CountriesCache

class TripResource(Resource):

    def post(self):
        uk = CountriesCache.get_by_code('GBR')
...