Я создаю 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')