我在我的项目中使用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"
但这导致了可怕的循环导入问题。我可以将我所有的资源导入夹在api.add_resource()
之上的cache = Cache(...)
行之下。然而,这感觉像是一种刺鼻的代码气味,并使一个非常,非常肉质的三明治。我更愿意把它们都放在文件的顶部。
解决这个问题的正确方法是什么?(希望不用修改代码库的大部分内容)
tl;dr: flask_api创建缓存并导入资源->资源无法从flask_api导入缓存
发布于 2020-02-12 11:58:43
好的,简单的解决方法是将缓存生成移动到资源文件夹中的__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={'...'})
然后,flask_api.py可以导入它并执行cache.init_app(app)
# flask_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中,而不需要在应用程序生成后将它们夹在中间,以避免循环导入。
我希望这对其他遇到类似问题的人有所帮助。
https://stackoverflow.com/questions/60152274
复制相似问题