My function:
@app.route("/media/<collection>/<unique_path>/<path:filename>")
def view_media_file(collection, unique_path, filename):
    document = db.find_one_or_404(collection, 'unique_path', unique_path)
    hex_id = filename.rsplit(".", 1)[0]
    if not hex_id in document.get("files", {}).keys():
        return "Error", 404
    response_obj = app.mongo.send_file(filename)
    return response_obj
when I try Flask-Caching:
@app.route("/media/<collection>/<unique_path>/<path:filename>")
@cache.cached()
def view_media_file(collection, unique_path, filename):
    ...
I get a 500 error with the following traceback:
Traceback (most recent call last):
  File "...flask/env/lib/python3.9/site-packages/flask/app.py", line 2548, in __call__
    return self.wsgi_app(environ, start_response)
  File "...flask/env/lib/python3.9/site-packages/flask/app.py", line 2528, in wsgi_app
    response = self.handle_exception(e)
  File "...flask/env/lib/python3.9/site-packages/flask/app.py", line 2525, in wsgi_app
    response = self.full_dispatch_request()
  File "...flask/env/lib/python3.9/site-packages/flask/app.py", line 1822, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "...flask/env/lib/python3.9/site-packages/flask/app.py", line 1820, in full_dispatch_request
    rv = self.dispatch_request()
  File "...flask/env/lib/python3.9/site-packages/flask/app.py", line 1796, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "...flask/env/lib/python3.9/site-packages/flask_caching/__init__.py", line 413, in decorated_function
    self.cache.set(
  File "...flask/env/lib/python3.9/site-packages/cachelib/simple.py", line 80, in set
    self._cache[key] = (expires, self.serializer.dumps(value))
  File "...flask/env/lib/python3.9/site-packages/cachelib/serializers.py", line 43, in dumps
    serialized = pickle.dumps(value, protocol)
TypeError: cannot pickle '_thread.lock' object
How do I serialize (dumps/loads) a pymongo response object that is a file?
I've tried this with cached and memoized, and I've tried to serialize with json and pickle modules. I understand that thread locking is the issue in the traceback, but I'm not very familiar with it, and don't really understand why it applies to this type of file response delivery, but not with a standard response.
Python 3.10.1
Flask==2.2.2
Flask-Caching==2.0.1
full response_obj:
object: <Response streamed [200 OK]>
type(object): <class 'flask.wrappers.Response'>
response_obj attributes:
<Response streamed [200 OK]>.accept_ranges: None
<Response streamed [200 OK]>.access_control_allow_credentials: False
<Response streamed [200 OK]>.access_control_allow_headers: None
<Response streamed [200 OK]>.access_control_allow_methods: None
<Response streamed [200 OK]>.access_control_allow_origin: None
<Response streamed [200 OK]>.access_control_expose_headers: None
<Response streamed [200 OK]>.access_control_max_age: None
<Response streamed [200 OK]>.add_etag: <bound method Response.add_etag of <Response streamed [200 OK]>>
<Response streamed [200 OK]>.age: None
<Response streamed [200 OK]>.allow: 
<Response streamed [200 OK]>.autocorrect_location_header: False
<Response streamed [200 OK]>.automatically_set_content_length: True
<Response streamed [200 OK]>.cache_control: max-age=31536000, public
<Response streamed [200 OK]>.calculate_content_length: <bound method Response.calculate_content_length of <Response streamed [200 OK]>>
<Response streamed [200 OK]>.call_on_close: <bound method Response.call_on_close of <Response streamed [200 OK]>>
<Response streamed [200 OK]>.charset: utf-8
<Response streamed [200 OK]>.close: <bound method Response.close of <Response streamed [200 OK]>>
<Response streamed [200 OK]>.content_encoding: None
<Response streamed [200 OK]>.content_language: 
<Response streamed [200 OK]>.content_length: 2924675
<Response streamed [200 OK]>.content_location: None
<Response streamed [200 OK]>.content_md5: None
<Response streamed [200 OK]>.content_range: 
<Response streamed [200 OK]>.content_security_policy: 
<Response streamed [200 OK]>.content_security_policy_report_only: 
<Response streamed [200 OK]>.content_type: image/png
<Response streamed [200 OK]>.cross_origin_embedder_policy: COEP.UNSAFE_NONE
<Response streamed [200 OK]>.cross_origin_opener_policy: COOP.UNSAFE_NONE
