Skip to content

Commit e9da8e3

Browse files
committed
Fix get user from request blocks loop
Fix get user from request blocks loop
1 parent ec585af commit e9da8e3

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

utils/core/dependencies.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
from fastapi import Depends, Form, Query, Request
3+
from starlette.concurrency import run_in_threadpool
34
from pydantic import EmailStr
45
from sqlmodel import Session, select
56
from sqlalchemy.orm import selectinload
@@ -427,7 +428,16 @@ async def get_user_from_request(request: Request) -> Optional[User]:
427428
"""
428429
Helper function to get user from request cookies in exception handlers.
429430
Exception handlers can't use Depends(), so we manually extract tokens and get the user.
431+
432+
Runs the actual (synchronous DB/session) work in the thread pool: this is
433+
called directly (not via Depends()) from async exception handlers running
434+
on the event loop, so without this it would block the loop for every
435+
concurrent request while it queries the database.
430436
"""
437+
return await run_in_threadpool(_get_user_from_request_sync, request)
438+
439+
440+
def _get_user_from_request_sync(request: Request) -> Optional[User]:
431441
access_token = request.cookies.get("access_token")
432442
refresh_token = request.cookies.get("refresh_token")
433443
tokens = (access_token, refresh_token)

0 commit comments

Comments
 (0)