Python flask_cache and memoize-生成_cache_键错误:类型为';非类型';没有len()
我对使用flask有点陌生,我想缓存一个函数的结果,该函数读取了pickle数据。我使用Python flask_cache and memoize-生成_cache_键错误:类型为';非类型';没有len(),python,flask,memoization,flask-cache,Python,Flask,Memoization,Flask Cache,我对使用flask有点陌生,我想缓存一个函数的结果,该函数读取了pickle数据。我使用flask\u cache中的memoize功能,如下所示: 在model_chacher.py中: from flask_cache import Cache import pickle model_cache = Cache(config={'CACHE_TYPE': 'simple'}) class ModelCacher(): @model_cache.memoize(50)
flask\u cache
中的memoize
功能,如下所示:
在model_chacher.py
中:
from flask_cache import Cache
import pickle
model_cache = Cache(config={'CACHE_TYPE': 'simple'})
class ModelCacher():
@model_cache.memoize(50)
def get_model(self, customer_ID):
with open('/path/to/data.pickle', 'rb') as tf:
model_args = pickle.load(tf)
trained_classifier = model_args[0]
return trained_classifier
from flask import Flask
from controllers.topic import controller as topic_controller
from models.modelcache.model_chacher import model_cache
app = Flask(__name__)
model_cache.init_app(app)
app.register_blueprint(topic_controller.topic_controller_blueprint)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, debug=True)
在flask\u compose.py
中:
from flask_cache import Cache
import pickle
model_cache = Cache(config={'CACHE_TYPE': 'simple'})
class ModelCacher():
@model_cache.memoize(50)
def get_model(self, customer_ID):
with open('/path/to/data.pickle', 'rb') as tf:
model_args = pickle.load(tf)
trained_classifier = model_args[0]
return trained_classifier
from flask import Flask
from controllers.topic import controller as topic_controller
from models.modelcache.model_chacher import model_cache
app = Flask(__name__)
model_cache.init_app(app)
app.register_blueprint(topic_controller.topic_controller_blueprint)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=80, debug=True)
我在topic\u controller
中调用ModelCacher.get\u model(customer\u ID)
:
from models.modelcache.model_chacher import ModelCacher
...
trained_classifier = ModelCacher.get_model(cls_str)
...
运行flask\u compose.py
并发送请求后,我得到以下结果:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
raise value
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/app/controllers/topic/controller.py", line 20, in classify
return ModelCacher.get_model(cls_str)
File "/usr/local/lib/python3.6/site-packages/flask_cache/__init__.py", line 528, in decorated_function
cache_key = decorated_function.make_cache_key(f, *args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/flask_cache/__init__.py", line 393, in make_cache_key
**kwargs)
File "/usr/local/lib/python3.6/site-packages/flask_cache/__init__.py", line 434, in _memoize_kwargs_to_args
elif abs(i-args_len) <= len(argspec.defaults):
TypeError: object of type 'NoneType' has no len()
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1997行,调用__
返回self.wsgi_应用程序(环境,启动响应)
wsgi_应用程序中的文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1985行
response=self.handle\u异常(e)
文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1540行,在句柄中
重放(exc_类型、exc_值、tb)
文件“/usr/local/lib/python3.6/site packages/flask/_compat.py”,第33行,重新登录
增值
wsgi_应用程序中的文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1982行
response=self.full\u dispatch\u request()
文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1614行,完整发送请求
rv=自身处理用户异常(e)
文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1517行,在handle\u user\u异常中
重放(exc_类型、exc_值、tb)
文件“/usr/local/lib/python3.6/site packages/flask/_compat.py”,第33行,重新登录
增值
文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1612行,完整发送请求
rv=自我分派请求()
文件“/usr/local/lib/python3.6/site packages/flask/app.py”,第1598行,在调度请求中
返回self.view_函数[rule.endpoint](**req.view_参数)
文件“/app/controllers/topic/controller.py”,第20行,分类
返回ModelCacher.get\u model(cls\u str)
文件“/usr/local/lib/python3.6/site packages/flask_cache/_init__.py”,第528行,在函数中
cache_key=修饰的_函数。生成_cache_key(f,*args,**kwargs)
文件“/usr/local/lib/python3.6/site packages/flask_cache/__init__.py”,第393行,在make_cache_key中
**kwargs)
文件“/usr/local/lib/python3.6/site packages/flask\u cache/\uuuuuu init\uuuuuuuuuuu.py”,第434行,在\u memorize\u kwargs\u to\u args中
elif abs(i-args_len)您定义的get_model
方法是实例方法而不是类方法。调用该方法时使用ModelCacher.get\u model(cls\u str)
。尝试使用ModelCacher()调用它。获取模型(cls\u str)
。或者,您可以将其定义为一个全局函数。谢谢@stamaimer的好意!我只是创建了我的ModelCacher
的一个实例,解决了这个问题,我还使用了flask\u cache.cache中的cached
,而不是memoize