diff --git a/fasthtml/core.py b/fasthtml/core.py
index 09c2acb4..53414dc6 100644
--- a/fasthtml/core.py
+++ b/fasthtml/core.py
@@ -274,10 +274,8 @@ async def _find_p(conn, data, hdrs, arg:str, p:Parameter):
if issubclass(anno, Starlette): return conn.scope['app']
if issubclass(anno, HTTPConnection): return conn
if issubclass(anno, State): return conn.scope['app'].state
- if anno is dict: return data
- if _is_body(anno):
- if 'session'.startswith(arg.lower()): return conn.scope.get('session', {})
- return await _from_body(conn, p, data)
+ if anno is dict: return conn.scope.get('session', {}) if 'session'.startswith(arg.lower()) else data
+ if _is_body(anno): return await _from_body(conn, p, data)
if (msg := _check_anno(arg, anno)): return warn(msg)
# Special param names with no annotations
if anno is empty:
diff --git a/nbs/api/00_core.ipynb b/nbs/api/00_core.ipynb
index a5ace4a8..8aa79aae 100644
--- a/nbs/api/00_core.ipynb
+++ b/nbs/api/00_core.ipynb
@@ -912,10 +912,8 @@
" if issubclass(anno, Starlette): return conn.scope['app']\n",
" if issubclass(anno, HTTPConnection): return conn\n",
" if issubclass(anno, State): return conn.scope['app'].state\n",
- " if anno is dict: return data\n",
- " if _is_body(anno):\n",
- " if 'session'.startswith(arg.lower()): return conn.scope.get('session', {})\n",
- " return await _from_body(conn, p, data)\n",
+ " if anno is dict: return conn.scope.get('session', {}) if 'session'.startswith(arg.lower()) else data\n",
+ " if _is_body(anno): return await _from_body(conn, p, data)\n",
" if (msg := _check_anno(arg, anno)): return warn(msg)\n",
" # Special param names with no annotations\n",
" if anno is empty:\n",
@@ -3514,6 +3512,29 @@
"test_r(cli, '/bodietd/', '{\"a\":1,\"b\":\"foo\"}', 'post', data=d)"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4b57a83f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "@app.get(\"/set_sess_dict\")\n",
+ "def _(session:dict):\n",
+ " session['foo'] = 'bar'\n",
+ " return 'ok'\n",
+ "\n",
+ "@app.get(\"/sess_dict\")\n",
+ "def _(session:dict): return session.get('foo')\n",
+ "\n",
+ "@app.post(\"/s_bodie\")\n",
+ "def _(s:Bodie): return asdict(s)\n",
+ "\n",
+ "cli.get('/set_sess_dict')\n",
+ "test_r(cli, '/sess_dict?foo=evil', 'bar')\n",
+ "test_r(cli, '/s_bodie', '{\"a\":1,\"b\":\"foo\"}', 'post', data=d)"
+ ]
+ },
{
"cell_type": "code",
"execution_count": null,