преобразовать функцию в представление в асинхронное.Джанго / питон - PullRequest
0 голосов
/ 17 мая 2019

Мне бы хотелось узнать ваше мнение о том, как преобразовать следующую функцию в асинхронную.

def currency_converter(price, curr1="SEK", curr2="EUR"):  
    c = CurrencyConverter()
    try:
        return c.convert(price, curr1, curr2)
    except ValueError or RateNotFoundError as err:
        return str(err)

Эта функция принимает цену, коды 2 валют и конвертирует цену в выбранную валюту. Проблема в том, что когда вы используете эту функцию в цикле, отправка и получение запросов на / с веб-хоста для каждой итерации занимает некоторое время (около 2-3 секунд для 20 запросов)

Эта функция используется при следующем просмотре в DJANGO:


class BlocketView(DetailView):
    model = BoatModel
    template_name = 'blocket.html'

    def get_context_data(self, **kwargs):
        context = DetailView.get_context_data(self, **kwargs)
        context["blocket"], context['pricelist'] = (spider(self.kwargs.get("name")))
        context["pricelist_euro"] = [currency_converter(price) for price in context['pricelist']]
        return context

Здесь он получает цены из прайс-листа и создает новый контекстный [[pricelist_euro »] список с конвертированными ценами.

Также эту функцию можно использовать как шаблонный фильтр:


@register.filter
def currency_converter(price, curr1="SEK", curr2="EUR"):
    c = CurrencyConverter()
    try:
        return c.convert(price, curr1, curr2)
    except ValueError or RateNotFoundError as err:
        return str(err)

Есть ли шанс как-то преобразовать эту функцию в асинхронную?

Спасибо

1 Ответ

0 голосов
/ 17 мая 2019

В конце концов я решил рассчитать обменный курс 1 раз, а затем использовать его для пересчета остальных цен. Все еще довольно медленно, хотя.

    def get_context_data(self, **kwargs):
        context = DetailView.get_context_data(self, **kwargs)
        context["blocket"], context['pricelist'] = (spider(self.kwargs.get("name")))
        rate = currency_converter(1000)
        context["pricelist_euro"] = []
        for price in context['pricelist']:
                try:
                    context["pricelist_euro"].append(int(price/rate))
                except TypeError:
                    context["pricelist_euro"].append(None)
        return context
...