Сетевые подключения к другому сервису всегда будут относительно медленными.Поэтому вам нужно найти способы избежать слишком большого числа таких запросов.
Обычный метод - некоторое время кэшировать результаты.Даже короткий кэш с диапазоном в несколько секунд может очень помочь, если вы обрабатываете много транзакций, которые используют небольшое количество валют.Прямо сейчас вы создаете новый запрос для каждого свойства, к которому обращаетесь, поэтому рендеринг вашей таблицы вызывает четыре запроса на строку транзакции, отображаемую .
Django уже имеет поддержку для кэширования данных ;ниже будет использоваться кэш, настроенный в CACHES = {..., 'currencies': {...},}
, если он существует, но в противном случае используется конфигурация 'default'
.Настройка конфигурации выделенного кэша позволяет вам установить такие вещи, как время ожидания только для данных о валюте.
Если у вас есть ключ API Cryptocompare, задайте его в CRYPTOCOMPARE_API_KEY
в файле settings.py
:
import requests
from django.conf import settings
from django.core.cache import caches, InvalidCacheBackendError
APIURL = 'https://min-api.cryptocompare.com/data/price'
class CurrencyPrices:
def __init__(self):
self.session = requests.Session() # re-use connections
api_key = getattr(settings, 'CRYPTOCOMPARE_API_KEY', None)
if api_key is not None:
self.session.headers['Authorization'] = f'Apikey {api_key}'
try:
self.cache = caches['currencies']
self.key_prefix = ''
except InvalidCacheBackendError:
self.cache = caches['default']
self.key_prefix = 'currency_cache_'
def get_currency_price(self, currency):
key = f'{self.key_prefix}{currency}'
value = self.cache.get(key)
if value is None:
params = {"fsym": currency, "tsyms": "EUR"}
response = self.session.get(APIURL, params=params)
value = response.json()['EUR']
self.cache.set(key, value)
return value
_currency_prices = CurrencyPrices() # single instance per process
get_currency_price = _currency_prices.get_currency_price
затем импортируйте get_currency_price
и используйте его для получения ваших значений:
@property
def coin_value(self):
return get_currency_price(self.currency)
Вот пример конфигурации кэша, которая кэширует ответы в локальной памяти в течение 10 секунд:
CACHES = {
'currencies': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'currencies',
'TIMEOUT': 10,
}
}
Проверьте, какие другие параметры могут потребоваться .