使用flask_restful和flask_caching进行循环导入

c89*_*f64 2 python flask flask-restful flask-caching

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

我的项目结构是这样的

flask_api.py
-resources
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然后我(尝试)将缓存导入到 my_resource.py - 我在其中使用 @cache 装饰器

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

但这会导致可怕的循环导入问题。我可以将所有资源导入夹在该cache = Cache(...)线上方api.add_resource()。然而,这感觉像是一种黑客代码的味道,并且是一个非常非常多肉的三明治。我宁愿将它们全部放在文件的顶部。

解决这个问题的正确方法是什么?(希望不要彻底修改大部分代码库)

tl;dr:flask_api 创建缓存并导入资源 -> 资源无法从flask_api 导入缓存

c89*_*f64 5

好吧,简单的解决方法是将缓存生成移动到资源文件夹中的 __init__.py 文件中

flask_api.py
-resources
--__init__.py
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py
Run Code Online (Sandbox Code Playgroud)

并在没有“app”参数的情况下启动缓存,如下所示

# __init__.py
cache = Cache(config={'...'})
Run Code Online (Sandbox Code Playgroud)

Flask_api.py 然后可以导入它并执行cache.init_app(app)

# flask_api.py
from resources import cache
cache.init_app(app)
Run Code Online (Sandbox Code Playgroud)

__init__.py并且资源也可以从中导入缓存

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

这不会对我的 Flask 应用程序造成大量结构变化,并且允许我将资源导入到 Flask_api 中,而无需在应用程序生成后将它们夹在中间,以避免循环导入。

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