# Session.custom property AttributeError: 'com.inductiveautomation.perspective.gateway.script' object has no attribute

**URL:** <https://forum.inductiveautomation.com/t/session-custom-property-attributeerror-com-inductiveautomation-perspective-gateway-script-object-has-no-attribute/115597>\
**Category:** Ignition\
**Tags:** perspective, ignition81\
**Created:** [May 19, 2026, 12:53pm UTC](https://forum.inductiveautomation.com/t/session-custom-property-attributeerror-com-inductiveautomation-perspective-gateway-script-object-has-no-attribute/115597 "2026-05-19T12:53:15Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![danielps1818](https://avatars.discourse-cdn.com/v4/letter/d/ecae2f/32.png) [@danielps1818](https://forum.inductiveautomation.com/u/danielps1818)\
**Post date:** [May 19, 2026, 12:53pm UTC](https://forum.inductiveautomation.com/t/session-custom-property-attributeerror-com-inductiveautomation-perspective-gateway-script-object-has-no-attribute/115597/1 "2026-05-19T12:53:15Z")

</div>

I have this code in a view on the **onStartUp** action.

```python
data = self.session.custom.rooms_data
if not data:
	self.session.custom.rooms_data = (
		perspective.get_rooms()
	)

```

For some reason I get this error:

```python
Error running action 'system.onStartup' on pages/page@C: Traceback (most recent call last): File "<function:runAction>", line 2, in runAction AttributeError: 'com.inductiveautomation.perspective.gateway.script' object has no attribute 'rooms_data'

```

> **Full Error**
>
> ```python
> com.inductiveautomation.ignition.common.script.JythonExecException: Traceback (most recent call last): File "", line 2, in runAction AttributeError: 'com.inductiveautomation.perspective.gateway.script' object has no attribute 'rooms_data'
> at org.python.core.Py.AttributeError(Py.java:176)
> at org.python.core.PyObject.noAttributeError(PyObject.java:965)
> at org.python.core.PyObject. __getattr__ (PyObject.java:959)
> at org.python.pycode._pyx11386.runAction$1(:3)
> at org.python.pycode._pyx11386.call_function()
> at org.python.core.PyTableCode.call(PyTableCode.java:173)
> at org.python.core.PyBaseCode.call(PyBaseCode.java:306)
> at org.python.core.PyFunction.function ___call__ (PyFunction.java:474)
> at org.python.core.PyFunction. __call__ (PyFunction.java:469)
> at org.python.core.PyFunction. __call__ (PyFunction.java:464)
> at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:847)
> at com.inductiveautomation.ignition.common.script.ScriptManager.runFunction(ScriptManager.java:829)
> at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$TrackingProjectScriptManager.runFunction(ProjectScriptLifecycle.java:868)
> at com.inductiveautomation.ignition.common.script.ScriptManager$ScriptFunctionImpl.invoke(ScriptManager.java:1010)
> at com.inductiveautomation.ignition.gateway.project.ProjectScriptLifecycle$AutoRecompilingScriptFunction.invoke(ProjectScriptLifecycle.java:950)
> at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:161)
> at com.inductiveautomation.perspective.gateway.script.ScriptFunctionHelper.invoke(ScriptFunctionHelper.java:98)
> at com.inductiveautomation.perspective.gateway.action.ScriptAction.runAction(ScriptAction.java:80)
> at com.inductiveautomation.perspective.gateway.action.ActionDecorator.runAction(ActionDecorator.java:18)
> at com.inductiveautomation.perspective.gateway.action.SecuredAction.runAction(SecuredAction.java:44)
> at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.lambda$call$0(ActionCollection.java:263)
> at com.inductiveautomation.perspective.gateway.api.LoggingContext.mdc(LoggingContext.java:54)
> at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:252)
> at com.inductiveautomation.perspective.gateway.model.ActionCollection$ActionSequence$ExecuteActionsTask.call(ActionCollection.java:221)
> at com.inductiveautomation.perspective.gateway.threading.BlockingTaskQueue$TaskWrapper.run(BlockingTaskQueue.java:154)
> at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
> at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
> at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
> at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
> at com.inductiveautomation.perspective.gateway.threading.BlockingWork$BlockingWorkRunnable.run(BlockingWork.java:58)
> at java.base/java.lang.Thread.run(Unknown Source)
> Caused by: org.python.core.PyException: AttributeError: 'com.inductiveautomation.perspective.gateway.script' object has no attribute 'rooms_data'
> ... 31 common frames omitted
> 
> ```

I'm missing something. Someone knows what it could be?

Thx in advance!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 19, 2026, 12:58pm UTC](https://forum.inductiveautomation.com/t/session-custom-property-attributeerror-com-inductiveautomation-perspective-gateway-script-object-has-no-attribute/115597/2 "2026-05-19T12:58:12Z")

</div>

What is surprising? `rooms_data` won't exist until **something** assigns to it. Use `if not hasattr(self.session.custom, 'rooms_data'):` as your condition.

---

<div class="post-metadata">

**Author:** ![danielps1818](https://avatars.discourse-cdn.com/v4/letter/d/ecae2f/32.png) [@danielps1818](https://forum.inductiveautomation.com/u/danielps1818)\
**Post date:** [May 19, 2026, 1:01pm UTC](https://forum.inductiveautomation.com/t/session-custom-property-attributeerror-com-inductiveautomation-perspective-gateway-script-object-has-no-attribute/115597/3 "2026-05-19T13:01:09Z")

</div>

I thought that when you declare a custom session property even if is set to null it will "exists". I'll change the code.  
I suppose that If I have a default value (as persistent) then it will work as I now have.

Thx pturmel!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [May 19, 2026, 1:06pm UTC](https://forum.inductiveautomation.com/t/session-custom-property-attributeerror-com-inductiveautomation-perspective-gateway-script-object-has-no-attribute/115597/4 "2026-05-19T13:06:51Z")

</div>

> [@danielps1818](#):
>
> default value (as persistent) then it will work

In that case, you will never call `perspective.get_rooms()`. 🤷‍♂️
