{"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":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"aiohttp/multipart.py","lineNumber":1006,"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":988,"sourceCodeEnd":1024,"githubUrl":"https://github.com/aio-libs/aiohttp/blob/c0ef574e29109210e96e652771ae4e7b88615fa4/aiohttp/multipart.py#L988-L1024","documentation":"Raised by MultipartWriter.append() when get_payload() cannot find any registered Payload factory for the given object type (it raises LookupError, which append converts to TypeError). The payload registry only knows a fixed set of types (bytes, str, IO, JSON-serializable, etc.); anything else cannot be turned into a body part.","triggerScenarios":"Calling `writer.append(obj)` where obj is a type with no registered payload factory — e.g. an int, a custom dataclass instance, a dict passed where a JSON/Bytes payload was expected, or None.","commonSituations":"Appending a bare number, a non-serializable object, or a custom class without first converting it to bytes/str/JSON; forgetting to use append_json() for dict/list data; passing a Payload subclass that isn't registered.","solutions":["Convert the object to a supported type first: `writer.append_json(obj)`, or `writer.append(str(obj))`, or `writer.append(bytes(obj))`.","Wrap it in an explicit Payload subclass (e.g. JsonPayload, BytesPayload) and pass that.","Register a custom payload factory with @payload_type for your class if you append it frequently."],"exampleFix":"// before\nwriter.append(42)  # int has no factory -> TypeError\n// after\nwriter.append_json({'value': 42})\n","handlingStrategy":"type-guard","validationCode":"from aiohttp.payload import PAYLOAD_REGISTRY_FACTORY_TYPES  # conceptual\nsupported = (bytes, bytearray, memoryview, str, dict, list, tuple, io.IOBase)\nif not isinstance(obj, supported):\n    raise TypeError(f'no payload factory for {type(obj)}')","typeGuard":"def has_payload_factory(obj) -> bool:\n    from aiohttp.payload import get_payload\n    try:\n        get_payload(obj)\n        return True\n    except LookupError:\n        return False","tryCatchPattern":"try:\n    writer.append(obj)\nexcept TypeError:\n    writer.append_json(obj)  # or str(obj) / bytes(obj)","preventionTips":["Convert custom objects to bytes/str/JSON before appending.","Use append_json() for dict/list data, not bare append().","Register a @payload_type factory for classes you append often."],"tags":["multipart","payload","writer","type-error"],"analyzedSha":"c0ef574e29109210e96e652771ae4e7b88615fa4","analyzedAt":"2026-08-04T19:51:05.467Z","schemaVersion":2}