Python 使用flask_restful和flask_缓存进行循环导入
在我的项目中,我已经使用了一段时间了,因为我喜欢将我的资源划分为不同的文件,以便进行基本的组织。现在我想添加flask_缓存,我遇到了一个(简单?)循环导入问题 我的项目结构是这样的Python 使用flask_restful和flask_缓存进行循环导入,python,flask,flask-restful,flask-caching,Python,Flask,Flask Restful,Flask Caching,在我的项目中,我已经使用了一段时间了,因为我喜欢将我的资源划分为不同的文件,以便进行基本的组织。现在我想添加flask_缓存,我遇到了一个(简单?)循环导入问题 我的项目结构是这样的 flask_api.py -resources --my_resource.py --my_other_resource.py --so_many_more_resources.py my_resources.py的端点添加到flask_api.py中,我还在其中创建flask_缓存对象,如下所示: # flas
flask_api.py
-resources
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py
my_resources.py的端点添加到flask_api.py中,我还在其中创建flask_缓存对象,如下所示:
# 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
然后,我(试图)将缓存导入到我的_resource.py中,在这里我使用@cache decorator
# resources/my_resource.py
from flask_api import cache
class GetStuff(Resource):
@cache.memoize(timeout=30)
def get():
return "Stuff"
但这导致了可怕的循环进口问题。
我可以将所有资源导入夹在cache=cache(…)
行下方,api.add\u resource()上方。然而,这感觉像是一种黑客代码的味道,使一个非常,非常肉三明治。我宁愿把它们都放在文件的最上面
解决这个问题的正确方法是什么?(希望不用大修代码库的大部分)
tl;dr:flask_api创建缓存并导入资源->资源无法从flask_api导入缓存好的,简单的解决方法是将缓存生成移动到resources文件夹中的uuu init_uuu.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)
并且资源也可以从\uuuu init\uuuuuuy.py
导入缓存
# my_resource.py
from . import cache
class GetStuff(Resource):
@cache.memoize(timeout=30)
def get():
return "Stuff"
这不会对我的flask应用程序造成大量的结构更改,并允许我将资源导入flask_api,而无需在应用程序生成后将它们夹在中间,以避免循环导入
我希望这能帮助其他遇到类似问题的人。试试
import flask\u api@my_resource.py中的flask_api.cache.memoize(timeout=30)
,不幸的是,模块“flask_api”没有属性“cache”
,因为文件将在创建缓存之前导入->必须在创建缓存之后夹心我的资源导入将上面的所有代码移动到另一个文件,然后从该文件导入api
。不确定这将如何解决问题。问题是应用程序和缓存必须位于同一个文件中,因为缓存依赖于应用程序。导入导入缓存(或应用程序,或文件api)的资源是问题,而不是api。。。你能举个例子吗?当前,app.run()也在flask_api(上面的代码中没有显示)中,您将cache.init_app(app)放在rest_api.py中,但我在您的文件夹结构中没有看到它?从资源导入缓存
从资源文件夹中的初始化
文件导入缓存对象。就在那里!哦,我明白了,对不起。我交替使用flask_api和rest_api。同一份文件,只是写这个答案弄得一团糟。纠正它
# my_resource.py
from . import cache
class GetStuff(Resource):
@cache.memoize(timeout=30)
def get():
return "Stuff"