циклический импорт с flask_restful и flask_caching - PullRequest
0 голосов
/ 10 февраля 2020

Я некоторое время использовал flask_restful в своем проекте, потому что мне нравится разделять свои ресурсы на разные файлы для организации c. Теперь я хотел бы добавить flask_caching, и я столкнулся с проблемой (простого?) Циклического импорта

Структура моего проекта выглядит следующим образом

flask_api.py
-resources
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py

Конечные точки my_resources.py добавляются в flask_api .py, где я также создаю объект Cache flask_cache следующим образом:

# flask_api.py
from flask import Flask
from flask_restful import Api
from flask_caching import Cache
from resources import my_resource
app = Flask(__name__)
cache = Cache(app, config={'sample config'})
api = Api(app)
api.add_resource(my_resource.GetStuff, '/api/v2/stuff/get')
# this file also runs the app

Затем я (пытаюсь) импортировать кэш в my_resource.py - где я использую декоратор @cache

# resources/my_resource.py
from flask_api import cache
class GetStuff(Resource):
    @cache.memoize(timeout=30)
    def get():
        return "Stuff"

но это вызывает ужасную проблему кругового импорта. Я мог бы поместить весь свой импорт ресурсов ниже линии cache = Cache(...), выше api.add_resource(). Тем не менее, это похоже на хакерский запах кода и делает очень, очень мясной бутерброд. Я бы предпочел, чтобы они были в верхней части файла.

Как правильно решить эту проблему? (надеюсь, без переделки больших частей кодовой базы)

tl; dr: flask_api создает кеш и импортирует ресурсы -> ресурсы не могут импортировать кеш из flask_api

1 Ответ

0 голосов
/ 12 февраля 2020

Хорошо, проще всего было переместить генерацию кэша в файл __init__.py в папке ресурсов

flask_api.py
-resources
--__init__.py
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py

и запустить кэш без параметра app, например,

# __init__.py
cache = Cache(config={'...'})

rest_api.py может затем импортировать его и сделать cache.init_app(app)

# rest_api.py
from resources import cache
cache.init_app(app)

, а ресурсы могут также импортировать кэш из __init__.py

# my_resource.py
from . import cache
class GetStuff(Resource):
    @cache.memoize(timeout=30)
    def get():
        return "Stuff"

Это не Это не вызывает массу структурных изменений для моего приложения flask и позволяет мне импортировать ресурсы в flask_api без сэндвича с ними после генерации приложения, чтобы избежать циклического импорта.

Надеюсь, это поможет любому, кто столкнется с подобными проблемами.

...