Skip to content

AttributeError: 'Response' object has no attribute '_charset'. Did you mean: 'charset'? #2705

@jaapz

Description

@jaapz
  • werkzeug 2.3.4
  • flask 2.3.2
  • python 3.10.11

When calling add_etag on a Response, my application throws an AttributeError.

compose-web-1  | Traceback (most recent call last):
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/flask/app.py", line 2213, in __call__
compose-web-1  |     return self.wsgi_app(environ, start_response)
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/flask/app.py", line 2193, in wsgi_app
compose-web-1  |     response = self.handle_exception(e)
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/flask/app.py", line 2190, in wsgi_app
compose-web-1  |     response = self.full_dispatch_request()
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/flask/app.py", line 1487, in full_dispatch_request
compose-web-1  |     return self.finalize_request(rv)
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/flask/app.py", line 1508, in finalize_request
compose-web-1  |     response = self.process_response(response)
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/flask/app.py", line 2002, in process_response
compose-web-1  |     response = self.ensure_sync(func)(response)
compose-web-1  |   File "/var/www/---/./app/__init__.py", line 95, in add_etag_to_response
compose-web-1  |     response.add_etag()
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/werkzeug/wrappers/response.py", line 790, in add_etag
compose-web-1  |     self.set_etag(generate_etag(self.get_data()), weak)
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/werkzeug/wrappers/response.py", line 284, in get_data
compose-web-1  |     rv = b"".join(self.iter_encoded())
compose-web-1  |   File "/var/www/---/venv/lib/python3.10/site-packages/werkzeug/wrappers/response.py", line 369, in iter_encoded
compose-web-1  |     return _iter_encoded(self.response, self._charset)
compose-web-1  | AttributeError: 'Response' object has no attribute '_charset'. Did you mean: 'charset'?

Response is simply the flask Response object. Weirdly this only happens in a production environment (docker container). When running locally in a development environment (same versions), _charset is set to "utf-8".

We don't override any of the Response classes, or any of the fields on there everything is from flask or werkzeug.

Downgrading to werkzeug 2.2.3 and flask 2.2.5 fixes the issue.

We call add_etag in an app.after_request callback.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions