带有flask_restful和flask_caching的圆形导入

问题描述 投票:0回答:1

我一直在项目中使用flask_restful一段时间,因为我喜欢将资源分为不同的文件以进行基本组织。现在我想添加flask_caching,并且遇到了(简单的?)循环导入问题

我的项目结构是这样的

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

将my_resources.py的端点添加到flask_api.py内,在这里我还创建了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导入缓存

python flask flask-restful flask-caching
1个回答
0
投票

好的,简单的解决方法是将缓存的生成移到资源文件夹中的__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中,而无需在应用程序生成后将其夹在中间,从而避免了循环导入。

我希望这可以帮助其他遇到类似问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.