Tornado v6.5.9 has breaking change regarding following symlinks
Author: veoxCreated Sep 14, 2026Updated Sep 15, 2026
Labelsbugstatus:Needs Triage
Description
JupyterLab - at least when installed in a virtualenv, but I suspect not limited to that - is not able to serve files.
From latest Tornado (released a few hours ago):
https://github.com/tornadoweb/tornado/releases/tag/v6.5.9
.StaticFileHandlerno longer follows symlinks outside of the static root directory. Applications that wish to continue the previous behavior may set the new argumentallowed_symlink_directoryto the directory (an ancestor of the static root) that should be used for symlink validation.
Reproduce
For completeness sake:
cd armon
virtualenv .virtualenv/`basename $(pwd)` && source .virtualenv/`basename $(pwd)`/bin/activate
pip install jupyterlab
jupyter lab --ip=jonesieA tab opens in a browser. Console shows:
[E 2026-09-14 22:40:36.509 ServerApp] Uncaught exception GET /static/lab/main.3cf434267b315d6a22fe.js?v=3cf434267b315d6a22fe (192.168.1.133)
HTTPServerRequest(protocol='http', host='jonesie:8888', method='GET', uri='/static/lab/main.3cf434267b315d6a22fe.js?v=3cf434267b315d6a22fe', version='HTTP/1.1', remote_ip='192.168.1.133')
Traceback (most recent call last):
File "/home/veox/src/armon/.virtualenv/armon/lib/python3.14/site-packages/tornado/web.py", line 1887, in _execute
result = await result
^^^^^^^^^^^^
File "/home/veox/src/armon/.virtualenv/armon/lib/python3.14/site-packages/tornado/web.py", line 2822, in get
self.absolute_path = self.validate_absolute_path(self.root, absolute_path)
~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/veox/src/armon/.virtualenv/armon/lib/python3.14/site-packages/jupyter_server/base/handlers.py", line 1067, in validate_absolute_path
return super().validate_absolute_path(root, absolute_path)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
File "/home/veox/src/armon/.virtualenv/armon/lib/python3.14/site-packages/tornado/web.py", line 3027, in validate_absolute_path
absolute_path = self._resolve_symlink_target(absolute_path)
File "/home/veox/src/armon/.virtualenv/armon/lib/python3.14/site-packages/tornado/web.py", line 3092, in _resolve_symlink_target
allowed_directory = os.path.realpath(self.allowed_symlink_directory)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'FileFindHandler' object has no attribute 'allowed_symlink_directory'
[E 2026-09-14 22:40:36.512 ServerApp] {
"Host": "jonesie:8888",
"Accept": "*/*",
"Referer": "http://jonesie:8888/lab",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:155.0) Gecko/20100101 Firefox/155.0"
}
[E 2026-09-14 22:40:36.512 ServerApp] 500 GET /static/lab/main.3cf434267b315d6a22fe.js?v=3cf434267b315d6a22fe ([email protected]) 3.53ms referer=http://jonesie:8888/labExpected behavior
Browser shows login page, loads favicon, etc.
Quickest workaround
Downgrade tornado.
pip install tornado==6.5.8Context
- Operating System and version: Arch Linux (rolling)
- Browser and version: Firefox 155 (not a browser issue)
- JupyterLab version: tried 4.6.3 and 4.5.4 - I suspect all
Source: jupyterlab/jupyterlab