Обновление глобальной переменной асихронным способом в Django

У меня есть проблема. На моем сайте вы можете найти трекер текущих цен на криптомонеты в качестве чисто контентного наполнителя. Я получаю данные из API монет, вам разрешено 100 запросов в день.

def crypto_api_prices(request):
    
    api_base_url = 'https://rest.coinapi.io/v1/exchangerate/'
    api_key = '==============='

    headers = {
        'X-CoinAPI-Key': api_key,
    }

    crypto_tickers = ["BTC","ETH","ETC","RVN"]
    crypto_api_links = [api_base_url+x+"/"+"USD" for x in crypto_tickers ]
    crypto_api_prices = [requests.get(x, headers=headers).json()['rate'] for x in crypto_api_links]
    context = {
        "cryptoPrices":crypto_api_prices
        }
    return context

Я вызываю эту функцию в моем главном представлении. К сожалению, если у меня есть несколько посетителей ежедневно, это генерирует 100 запросов довольно быстро, и мой элемент больше не работает.

Я хочу добиться того, чтобы установить crypto_api_prices как глобальную переменную и обновлять ее каждый час, так что независимо от того, сколько пользователей будет на моей странице, я буду генерировать только 24 запроса.

Является ли это хорошей идеей? Есть ли альтернативы? Конечно, я могу купить больше запросов, но этот сайт - проект "страсти", поэтому я хочу снизить затраты

Я бы сделал две вещи:

  1. Я бы использовал

    /v1/exchangerate/USD?invert=true
    

    для получения ставок для всех тикеров в одном запросе

    (док: https://docs.coinapi.io/?python#get-all-current-rates-get)

    и позже я бы отфильтровал нужные тикеры. И это будет работать, даже если я изменю список тикеров

    .
  2. Я бы использовал requests-cache для получения результатов из кэша, и делал бы реальные запросы только каждые 15 минут - так что это должно дать 100 запросов в день

    .

Минимальный рабочий код

import os
import requests
import requests_cache
from datetime import timedelta

# --- constants ---  # PEP8: `UPPER_CASE_NAMES` for constants

API_KEY = os.getenv('COINAPI_TOKEN')

# --- session: cache and API key ---

s = requests_cache.CachedSession(expire_after=timedelta(minutes=15))
#s.cache.clear()  # manually clear cache

s.headers.update({'X-CoinAPI-Key': API_KEY})

# --- every rate separatelly ---

url = 'https://rest.coinapi.io/v1/exchangerate/{}/USD'

tickers = ["BTC", "ETC", "ETH", "RVN"]

prices = {coin: s.get(url.format(coin)).json()['rate']
            for coin in tickers}

context = {"cryptoPrices": prices}

print(context["cryptoPrices"])

# --- all rates ---

url = 'https://rest.coinapi.io/v1/exchangerate/USD?invert=True'

response = s.get(url)
data = response.json()

# filter data

tickers = ["BTC", "ETH", "ETC", "RVN"]

prices = {}

for item in data['rates']:
    if item['asset_id_quote'] in tickers:
        key = item['asset_id_quote']
        val = item['rate']
        prices[key] = val

context = {"cryptoPrices": prices}

print(context["cryptoPrices"])
Вернуться на верх