Konstantin18ko
@Konstantin18ko
Стоматолог

Почему медленно отдает ответ?

У МЗ РФ есть реестр МО.
Чтоб его получить есть SOAP сервис.
Если справочник большой, то он делится на части, в каждой части определенной количество записей.

Есть два метода, первый получаю количество частей, второй количество записей в одной части:
def get_ref_book_parts(request):
    if request.user.is_authenticated:
        ref_book_code = request.GET.get("ref_book_code")
        version = request.GET.get("version")
        settings = zeep.Settings(strict=True)
        client = zeep.Client(wsdl=wsdl, settings=settings)
        return HttpResponse(
            re.sub(
                r'"',
                "*",
                str(client.service.getRefbookParts(user_key, ref_book_code, version)),
            )
            .replace("'", '"')
            .replace("None", "null")
        )
    else:
        return redirect("/api-auth/login/", locals())


def get_ref_book_partial(request):
    if request.user.is_authenticated:
        ref_book_code = request.GET.get("ref_book_code")
        version = request.GET.get("version")
        part_number = request.GET.get("part_number")
        settings = zeep.Settings(strict=True)
        client = zeep.Client(wsdl=wsdl, settings=settings)
        return HttpResponse(
            str(
                client.service.getRefbookPartial(
                    user_key, ref_book_code, version, part_number
                )
            )
        )
    else:
        return redirect("/api-auth/login/", locals())

Через VueJS + Axios сделал запрос при загрузке страницы и получение всех частей:
axios
            .get('/soap/get_ref_book_parts/', {
                params: {
                    ref_book_code: '1.2.643.5.1.13.13.11.1461', // Виды медицинских направлений
                    version: '5.61'
                }
            })
            .then(response => (getNames(parseInt(response.data.item[0].value, 10))))
            .catch(error => (console.log(error)))
            .then();

function getNames(parts) {
            for (parts; parts !== 0; parts--) {
                axios
                    .get('/soap/get_ref_book_partial/', {
                        params: {
                            ref_book_code: '1.2.643.5.1.13.13.11.1461', // Виды медицинских направлений
                            version: '5.61',
                            part_number: parts
                        }
                    })
                    .then(response => (console.log(response)))
                    .catch(error => (console.log(error)))
                    .then();
            }
        }

В итоге - справочник 26 частей.
Через for моментально делает 26 запросов:
5c56031f30938095329987.png
Как это выглядит со стороны сервера:
5c5603928cd97794166789.png
Тоже самое виде текста:

[02/Feb/2019 20:43:57] "GET /soap/get_ref_book/?ref_book_code=1.2.643.5.1.13.2.1.1.358&version=1.0 HTTP/1.1" 200 15394
[02/Feb/2019 20:43:57] "GET /soap/get_ref_book/?ref_book_code=1.2.643.5.1.13.13.11.1009&version=2.1 HTTP/1.1" 200 13556
[02/Feb/2019 20:44:29] "GET /soap/get_ref_book_parts/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61 HTTP/1.1" 200 167
[02/Feb/2019 20:45:54] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=24 HTTP/1.1" 200 7534088
[02/Feb/2019 20:46:08] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=21 HTTP/1.1" 200 7501284
[02/Feb/2019 20:46:08] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=25 HTTP/1.1" 200 7537635
[02/Feb/2019 20:46:08] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=22 HTTP/1.1" 200 7483618
[02/Feb/2019 20:46:11] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=23 HTTP/1.1" 200 7504062
[02/Feb/2019 20:46:13] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=20 HTTP/1.1" 200 7608268
[02/Feb/2019 20:49:29] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=23 HTTP/1.1" 200 7504062
[02/Feb/2019 20:49:34] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=22 HTTP/1.1" 200 7483618
[02/Feb/2019 20:49:34] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=25 HTTP/1.1" 200 7537635
[02/Feb/2019 20:49:35] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=21 HTTP/1.1" 200 7501284
[02/Feb/2019 20:49:36] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=24 HTTP/1.1" 200 7534088
[02/Feb/2019 20:49:38] "GET /soap/get_ref_book_partial/?ref_book_code=1.2.643.5.1.13.13.11.1461&version=5.61&part_number=20 HTTP/1.1" 200 7608268


Почему JS отдает 26 запросов по очереди, а сервер обрабатывает 26 запросов пачками по 5 с интервалам 5 минут между пачками?
  • Вопрос задан
  • 178 просмотров
Пригласить эксперта
Ответы на вопрос 1
Konstantin18ko
@Konstantin18ko Автор вопроса
Стоматолог
Решил путем кэширования страницы на 1 час.
CLI

python manage.py createcachetable cache_table

settings.py

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'cache_table',
}
}

views.py
from django.views.decorators.cache import cache_page

@cache_page(60 * 60) 
def get_ref_book_partial(request):
    if request.user.is_authenticated:
        ref_book_code = request.GET.get("ref_book_code")
        version = request.GET.get("version")
        part_number = request.GET.get("part_number")
        settings = zeep.Settings(strict=True)
        client = zeep.Client(wsdl=wsdl, settings=settings)
        return HttpResponse(
            str(
                client.service.getRefbookPartial(
                    user_key, ref_book_code, version, part_number
                )
            )
        )
    else:
        return redirect("/api-auth/login/", locals())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы