{"record":{"id":"fa8b0598a7ee456f","repo":"reflex-dev/reflex","slug":"on-upload-progress-is-not-a-valid-event-handler","errorCode":null,"errorMessage":"{on_upload_progress} is not a valid event handler.","messagePattern":"(.+?) is not a valid event handler\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/reflex-base/src/reflex_base/event/__init__.py","lineNumber":1342,"sourceCode":"                ),\n            )\n        if self.on_upload_progress is not None:\n            on_upload_progress = self.on_upload_progress\n            if isinstance(on_upload_progress, EventHandler):\n                events = [\n                    call_event_handler(\n                        on_upload_progress,\n                        self.on_upload_progress_args_spec,\n                    ),\n                ]\n            elif isinstance(on_upload_progress, Callable):\n                # Call the lambda to get the event chain.\n                events = call_event_fn(\n                    on_upload_progress, self.on_upload_progress_args_spec\n                )\n            else:\n                msg = f\"{on_upload_progress} is not a valid event handler.\"\n                raise ValueError(msg)\n            if isinstance(events, Var):\n                msg = f\"{on_upload_progress} cannot return a var {events}.\"\n                raise ValueError(msg)\n            on_upload_progress_chain = EventChain(\n                events=[*events],\n                args_spec=self.on_upload_progress_args_spec,\n            )\n            formatted_chain = str(format.format_prop(on_upload_progress_chain))\n            spec_args.append(\n                (\n                    Var(_js_expr=\"on_upload_progress\"),\n                    FunctionStringVar(\n                        formatted_chain.strip(\"{}\"),\n                    ).to(FunctionVar, EventChain),\n                ),\n            )\n        return EventSpec(\n            handler=handler,","sourceCodeStart":1324,"sourceCodeEnd":1360,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-base/src/reflex_base/event/__init__.py#L1324-L1360","documentation":"Upload event specs accept an on_upload_progress callback that must be an EventHandler, EventSpec, or a lambda/Callable; anything else cannot be turned into a progress event chain and is rejected when the spec is compiled (as_event_spec).","triggerScenarios":"Passing a string, Var, or plain object to on_upload_progress= of rx.upload_files / rx.upload_files_chunk, or a non-lambda non-handler callable wrapper the framework doesn't recognize as EventHandler/EventSpec.","commonSituations":"Naming a method incorrectly (passing 'on_progress' string), passing an unbound method reference, or passing a Var holding a handler name from dynamic config.","solutions":["Pass the bound state method reference or a lambda: on_upload_progress=State.track_progress or on_upload_progress=lambda e: State.track(e.progress)","Ensure it is a real EventHandler (decorated state method), not a string or Var"],"exampleFix":"# before\nrx.upload_files_chunk(on_upload_progress='track')\n# after\nrx.upload_files_chunk(on_upload_progress=State.track)","handlingStrategy":"type-guard","validationCode":"from reflex_base.event import EventHandler, EventSpec\nfrom collections.abc import Callable\n\ndef ok_progress(p) -> bool:\n    return isinstance(p, (EventHandler, EventSpec)) or callable(p)","typeGuard":"def is_progress_handler(p) -> TypeGuard[object]: return isinstance(p, (EventHandler, EventSpec)) or callable(p)","tryCatchPattern":null,"preventionTips":["Always pass a decorated state method to on_upload_progress"],"tags":["reflex","file-upload","event-handler","validation"],"backgroundTag":"invalid-event-handler-binding","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}