asyns requests to api in django view

у меня есть джанго аппликация и мне нужно в одной вюхе вернуть значение с одной апи Например: человек будет заходить на страницу, будет делаться запрос к апи и возвращать значение мне интересно надо делать запросы асинхронно? если на эту страницу будут заходить много людей вот мой код:

import aiohttp
import asynsio
asyns def get_rate():
    url = 'https://api.ratesapi.io/api/latest?base=USD&symbols=GBP'
    async with session.get(url) as response:
        json_response = await response.json()
        return json_response

def test_view(request):
    usd = asyncio.run(get_rate())['ratest]["USD]
    return render(request, '???.html', {'usd':usd})

правильно так или нужно по другому??


Ответы (1 шт):

Автор решения: eri

Правильный вызов асинхронного кода в Django такой

https://docs.djangoproject.com/en/3.1/topics/async/#async-to-sync

from asgiref.sync import async_to_sync
import aiohttp
import asynsio

@async_to_sync
async def get_rate():
    url = 'https://api.ratesapi.io/api/latest?base=USD&symbols=GBP'
    async with session.get(url) as response:
        json_response = await response.json()
        return json_response

def test_view(request):
    usd = get_rate()['ratest]["USD]
    return render(request, '???.html', {'usd':usd})

Но использовать вызовы для каждого запроса - плохая идея. Используйте кеш https://docs.djangoproject.com/en/3.1/topics/cache/

from django.core.cache import cache

....

    usd = cache.get_or_set("USD", get_rate, timeout=60)['ratest]["USD]
→ Ссылка