UWSGI 通过 UNIX 套接字连接到 Flask 应用程序:
NGINX(监听端口 80)<-> UWSGI(每个 UNIX-SOCKER 的列表)<-> FLASK-APP
我已经初始化了一个 uwsgi 缓存来处理全局数据。我想使用 python 包 Flask-caching 来处理缓存。
我正在尝试使用正确的缓存地址初始化缓存实例。似乎有什么不对劲。我认为 app.run() 的参数与 uwsgi 无关。
如果我设置缓存条目,它总是返回 None:
app.route("/")
def test():
cache.set("test", "OK", timeout=0)
a = cache.get("test")
return a
Run Code Online (Sandbox Code Playgroud)
主要.py
from flask import Flask
from flask_caching import Cache
app = Flask(__name__)
# Check Configuring Flask-Caching section for more details
cache = Cache(app, config={'CACHE_TYPE': 'uwsgi', 'CACHE_UWSGI_NAME':'mycache@localhost'})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Run Code Online (Sandbox Code Playgroud)
uwsgi.ini
[uwsgi]
module = main
callable = app
cache2 = name=mycache,items=100 …Run Code Online (Sandbox Code Playgroud) 我在python中使用我的API中的Flask缓存.
目前我正在使用装饰器@app.cache.memoize(cache_memoize_value),我通过调用来冲洗它app.cache.delete_memoized(view)
问题是,memoize它将被缓存n视图而不是特定的时间.如果我想为缓存指定超时,我需要使用装饰器@app.cache.cached(timeout=300)并清除它app.cache.clear().但是,这种清晰的方法将清除一切,而不仅仅是一个特定的观点.
如何在使用缓存装饰器时清除特定视图?
为了缓存一些数据,我调用了 cache.set 方法。但是它正在抛出 KeyError。错误日志:
File "D:\Sample_Project\SomeRouter.py", line 176, in run
FetchFeed._prepareCache(f_content, cache, _program, _sprint)
File "D:\Sample_Project\SomeRouter.py", line 197, in _prepareCache
cache.set(cKey, data[last_index:last_index + MAX_DATA_PER_PAGE])
File "c:\python\lib\site-packages\flask_caching\__init__.py", line 254, in set
return self.cache.set(*args, **kwargs)
File "c:\python\lib\site-packages\flask_caching\__init__.py", line 246, in cache
return app.extensions["cache"][self]
KeyError: <flask_caching.Cache object at 0x04F9C8D0>
Run Code Online (Sandbox Code Playgroud)
服务器模块如下所示:
cache_type = 'simple' if 'FLASK_ENV' in os.environ and os.environ['FLASK_ENV'] == 'development' else 'uwsgi'
cache = Cache(config={'CACHE_TYPE': cache_type})
app = Flask("MY_PROJECT")
cache.init_app(app)
# some api.route functions
# goes here ....
if __name__ == "__main__": …Run Code Online (Sandbox Code Playgroud) 我正在使用 Flask 构建一个 Web 表单,希望用户能够输入多个条目,并在将数据发送到数据库之前让他们有机会使用撤消按钮后悔输入。我正在尝试使用Flask-Caching但未能正确设置它。
我已经按照Flask Mega-Tutorial来设置 Flask(这是我的第一个 Flask 应用程序)。
+---app
| | forms.py
| | routes.py
| | __init__.py
| +---static
| +---templates
Run Code Online (Sandbox Code Playgroud)
我想知道我需要如何配置 Flask 应用程序才能基本上能够执行以下操作:
cache.add("variable_name", variable_data)
variable_name = cache.get("variable_name")
cache.clear()
Run Code Online (Sandbox Code Playgroud)
在其中一页(带有 @app.route 装饰器的函数)?
在应用程序中。init.py我有:
from flask import Flask
from config import Config
from flask_caching import Cache
app = Flask(__name__)
app.config.from_object(Config)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
from app import routes
Run Code Online (Sandbox Code Playgroud)
在routes.py中我有:
from flask import current_app
Run Code Online (Sandbox Code Playgroud)
当我尝试调用缓存时,我使用下面的代码。
current_app.cache.add("variable_name", variable_data)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用该表单时,出现以下错误:
AttributeError: 'Flask' object …Run Code Online (Sandbox Code Playgroud) 我只是想知道使用Flask-Caching时响应的存储方式和位置。
例如:
from flask import Flask, request
from flask_caching import Cache
import datetime
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
def make_cache_key(*args, **kwargs):
return request.url
@app.route('/', methods=['GET'])
@cache.cached(timeout=50, key_prefix=make_cache_key)
def foo():
time = str(datetime.datetime.now()) + " " + str(request.url)
return time, 200
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud) 我在项目中使用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 …