flask_restful 和 flask_caching 循环导入
circular import with flask_restful and flask_caching
我在我的项目中使用 flask_restful 有一段时间了,因为我喜欢将我的资源分成不同的文件以进行基本组织。现在我想将 flask_caching 和 运行 添加到一个(简单的?)循环导入问题中
我的项目结构是这样的
flask_api.py
-resources
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py
my_resources.py的Endpoints添加到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
导入缓存
好吧,简单的解决方法是将缓存生成移动到资源文件夹中的 __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 而无需在应用程序生成后将它们夹在中间以避免循环导入。
我希望这对遇到类似问题的其他人有所帮助。
我在我的项目中使用 flask_restful 有一段时间了,因为我喜欢将我的资源分成不同的文件以进行基本组织。现在我想将 flask_caching 和 运行 添加到一个(简单的?)循环导入问题中
我的项目结构是这样的
flask_api.py
-resources
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py
my_resources.py的Endpoints添加到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
导入缓存好吧,简单的解决方法是将缓存生成移动到资源文件夹中的 __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 而无需在应用程序生成后将它们夹在中间以避免循环导入。
我希望这对遇到类似问题的其他人有所帮助。