Async await вызов request.user в Django 4.1 вызывает SynchronousOnlyOperation

Я использую этот асинхронный код для проверки пользователя is_authenticated:

async def offers(request, currency_id):
    user = await User.objects.aget(pk=request.user.pk)
    currency = await sync_to_async(get_object_or_404)(Currency, pk=currency_id)
    offers_to_sell = [
        item
        async for item in Offer.objects.filter(
            currency_to_sell_id=currency_id
        ).prefetch_related("currency_to_sell", "currency_to_buy")
    ]
    context = {"currency": currency, "offers_to_sell": offers_to_sell, "user": user}
    return render(request, template_name="offers.html", context=context)

Но он выдает ошибку:

SynchronousOnlyOperation 
You cannot call this from an async context - use a thread or sync_to_async.

Traceback (most recent call last):
  File "\venv\lib\site-packages\django\contrib\sessions\backends\base.py", line 187, in _get_session
    return self._session_cache

Также я попробовал этот код, но безрезультатно:

user = await sync_to_async(User.objects.get)(pk=request.user.pk)

Из шаблона без использования кода в представлении:

{% if request.user.is_authenticated %}

Но результат тот же.

Похоже, я что-то упустил в отношении асинхронного вызова. В чем проблема?

Заметил это сам, мне удалось обойти это, обратившись к нему следующим образом:

@sync_to_async
def get_user_from_request(request: HttpRequest) -> User | AnonymousUser | None:
    return request.user if bool(request.user) else None

И вызываем это в представлении

async def api_view(request: HttpRequest) -> None:
    user = await get_user_from_request(request)

Похоже, что другие уже давно испытывают то же самое https://code.djangoproject.com/ticket/31920, и что решения ищутся, например: user = await request.auser()

Вернуться на верх