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()