{"record":{"id":"6c0f73863974ab77","repo":"aio-libs/aiohttp","slug":"cannot-create-payload-from-r","errorCode":null,"errorMessage":"Cannot create payload from %r","messagePattern":"Cannot create payload from %r","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"aiohttp/multipart.py","lineNumber":1015,"sourceCode":"\n        return '\"' + quoted_value_content.decode(\"ascii\") + '\"'\n\n    @property\n    def boundary(self) -> str:\n        return self._boundary.decode(\"ascii\")\n\n    def append(self, obj: Any, headers: Mapping[str, str] | None = None) -> Payload:\n        if headers is None:\n            headers = CIMultiDict()\n\n        if isinstance(obj, Payload):\n            obj.headers.update(headers)\n            return self.append_payload(obj)\n        else:\n            try:\n                payload = get_payload(obj, headers=headers)\n            except LookupError:\n                raise TypeError(\"Cannot create payload from %r\" % obj)\n            else:\n                return self.append_payload(payload)\n\n    def append_payload(self, payload: Payload) -> Payload:\n        \"\"\"Adds a new body part to multipart writer.\"\"\"\n        encoding: str | None = None\n        te_encoding: str | None = None\n        if self._is_form_data:\n            # https://datatracker.ietf.org/doc/html/rfc7578#section-4.7\n            # https://datatracker.ietf.org/doc/html/rfc7578#section-4.8\n            assert (\n                not {CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TRANSFER_ENCODING}\n                & payload.headers.keys()\n            )\n            # Set default Content-Disposition in case user doesn't create one\n            if CONTENT_DISPOSITION not in payload.headers:\n                name = f\"section-{len(self._parts)}\"\n                payload.set_content_disposition(\"form-data\", name=name)","sourceCodeStart":997,"sourceCodeEnd":1033,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/d041d4d0fd48c3f0832084d33be16cf1c4835f85/aiohttp/multipart.py#L997-L1033","documentation":"MultipartWriter.append delegates to get_payload(obj) to convert a non-Payload object into a Payload. If no payload factory is registered for the object's type, get_payload raises LookupError, which append converts to TypeError 'Cannot create payload from %r'.","triggerScenarios":"Calling mw.append(obj) with an object type aiohttp has no payload factory for: arbitrary custom classes, nested dicts/lists (without JsonPayload), numpy arrays, dataclasses, SQLAlchemy models, None (in some contexts), etc.","commonSituations":"Appending a dict directly instead of json.dumps-ing it; appending a custom dataclass; appending an object whose type was never registered via payload_type/register payload factories.","solutions":["Convert the object to a supported primitive first: mw.append(JsonPayload({'k': 'v'})).","Wrap bytes/str/file in the matching payload (BytesPayload, StringPayload, BufferedReaderPayload).","Register a payload factory for your type with payload.register_payload_factory(MyType, factory).","If appending JSON, use aiohttp.payload.JsonPayload(obj)."],"exampleFix":"// before\nmw.append({'name': 'alice'})\n\n// after\nfrom aiohttp import JsonPayload\nmw.append(JsonPayload({'name': 'alice'}))","handlingStrategy":"type-guard","validationCode":"from aiohttp.payload import PAYLOAD_REGISTRY, JsonPayload, BytesPayload, StringPayload\nimport json, typing\n\ndef to_payload(obj, headers=None):\n    if isinstance(obj, (bytes, bytearray)):\n        return BytesPayload(bytes(obj), headers=headers)\n    if isinstance(obj, str):\n        return StringPayload(obj, headers=headers)\n    if isinstance(obj, (dict, list)):\n        return JsonPayload(obj, headers=headers)\n    # last resort: try the registry\n    from aiohttp.payload import get_payload\n    return get_payload(obj, headers=headers)","typeGuard":"from aiohttp.payload import Payload\nimport typing\ndef is_payload_or_supported(obj: typing.Any) -> bool:\n    if isinstance(obj, Payload):\n        return True\n    return isinstance(obj, (bytes, bytearray, str, dict, list))","tryCatchPattern":"try:\n    mw.append(obj)\nexcept TypeError as e:\n    if 'Cannot create payload' in str(e):\n        mw.append(JsonPayload(json.dumps(obj)))\n    else:\n        raise","preventionTips":["Convert custom objects to bytes/str/JSON before appending, or wrap them in a Payload subclass.","Register payload factories for your own types via aiohttp.payload.register_payload_factory.","Prefer JsonPayload for dict/list, BytesPayload for bytes, StringPayload for str."],"tags":["multipart","payload","writer","typeerror","serialization","lookuperror"],"backgroundTag":null,"analyzedSha":"d041d4d0fd48c3f0832084d33be16cf1c4835f85","analyzedAt":"2026-08-11T20:44:15.550Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}