{"id":"6e12de377685b35f","repo":"aio-libs/aiohttp","slug":"key","errorCode":null,"errorMessage":"{key}","messagePattern":"\\{key\\}","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"aiohttp/helpers.py","lineNumber":983,"sourceCode":"\n    def __init_subclass__(cls) -> None:\n        raise TypeError(\n            f\"Inheritance class {cls.__name__} from ChainMapProxy is forbidden\"\n        )\n\n    @overload  # type: ignore[override]\n    def __getitem__(self, key: AppKey[_T]) -> _T: ...\n\n    @overload\n    def __getitem__(self, key: str) -> Any: ...\n\n    def __getitem__(self, key: str | AppKey[_T]) -> Any:\n        for mapping in self._maps:\n            try:\n                return mapping[key]\n            except KeyError:\n                pass\n        raise KeyError(key)\n\n    @overload  # type: ignore[override]\n    def get(self, key: AppKey[_T], default: _S) -> _T | _S: ...\n\n    @overload\n    def get(self, key: AppKey[_T], default: None = ...) -> _T | None: ...\n\n    @overload\n    def get(self, key: str, default: Any = ...) -> Any: ...\n\n    def get(self, key: str | AppKey[_T], default: Any = None) -> Any:\n        try:\n            return self[key]\n        except KeyError:\n            return default\n\n    def __len__(self) -> int:\n        # reuses stored hash values if possible","sourceCodeStart":965,"sourceCodeEnd":1001,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/c0ef574e29109210e96e652771ae4e7b88615fa4/aiohttp/helpers.py#L965-L1001","documentation":"Raised by ChainMapProxy.__getitem__ as KeyError(key) when the key is absent from every backing mapping. ChainMapProxy backs Application/request/response storage, so requesting a storage key that was never stored re-raises the raw key as the KeyError message (the '{key}' template).","triggerScenarios":"request.app['my_key'] or app['my_key'] before app['my_key'] = value was set; using a string key that was never registered; misspelling of an AppKey. Also ctx lookups through the proxy.","commonSituations":"Middleware fetching a key set by another middleware that didn't run; typo in key name; key set on a sub-application but read from the parent; lifecycle ordering (cleanup_ctx vs startup).","solutions":["Use .get(key, default) instead of [key] for optional entries.","Ensure the key is set in an on_startup handler before readers run.","Verify the Application instance is the same one (sub-app vs parent) where the key lives."],"exampleFix":"// before\nval = request.app['feature_flag']  # KeyError if unset\n// after\nval = request.app.get('feature_flag', default_value)","handlingStrategy":"validation","validationCode":"def safe_get(app, key, default=None):\n    return app.get(key, default)","typeGuard":"def key_is_set(app, key) -> bool:\n    return key in app","tryCatchPattern":"try:\n    val = request.app[key]\nexcept KeyError:\n    val = default","preventionTips":["Prefer .get(key, default) for optional storage entries.","Set keys in on_startup before any reader middleware runs.","Confirm the Application instance (parent vs sub-app) owns the key."],"tags":["chainmapproxy","keyerror","application","storage","middleware"],"analyzedSha":"c0ef574e29109210e96e652771ae4e7b88615fa4","analyzedAt":"2026-08-04T19:51:05.467Z","schemaVersion":2}