flask cache and memoize-make cache key error: объект типа 'NoneType' не имеет len()


Я вроде как новичок в использовании flask, и я хочу кэшировать результат функции, которая считывает маринованные данные. Я использую функцию memoize из flask_cache следующим образом:

В 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

В flask_compose.py:

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)

И я называю ModelCacher.get_model(customer_ID) в topic_controller:

from models.modelcache.model_chacher import ModelCacher
...
trained_classifier = ModelCacher.get_model(cls_str)
...

И после запуска flask_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()

И мой вопрос: Как правильно настроить мой кэш? любая помощь очень ценится.

ПРАВИТЬ: ЧТО РЕШИЛ СВОЮ ПРОБЛЕМУ:

Как указал @stamaimer, я создаю и экземпляр моего ModelCacher, и это решило проблему, также я использовал кэшированный из flask_cache.Cache вместо memoize.

1 3

1 ответ:

Метод get_model, который вы определили, является методом экземпляра, а не методом класса. Вы используете ModelCacher.get_model(cls_str) при вызове метода. Попробуйте вызвать его с помощью ModelCacher().get_model(cls_str). Или вы можете просто определить его как глобальную функцию.