Django Rest Framework Swagger API. paginate_queryset требует много времени для выполнения

Я разработал REST API с использованием Swagger. Когда клиент пытается получить ответ с помощью API, он не получает ответа (ответ 500).

Response Code
500
Response Headers
{
  "connection": "close",
  "content-length": "131",
  "content-type": "text/html",
  "date": "Sun, 19 Sep 2021 10:50:08 GMT"
}

Проблема возникает в pagination.py

def paginate_queryset(self, queryset, request, view=None):
    """
    Paginate a queryset if required, either returning a
    page object, or `None` if pagination is not configured for this view.
    """
    page_size = self.get_page_size(request)
    if not page_size:
        return None

    paginator = self.django_paginator_class(queryset, page_size)
    page_number = self.get_page_number(request, paginator)

    try:
        self.page = paginator.page(page_number)
    except InvalidPage as exc:
        msg = self.invalid_page_message.format(
            page_number=page_number, message=str(exc)
        )
        raise NotFound(msg)

    if paginator.num_pages > 1 and self.template is not None:
        # The browsable API should display pagination controls.
        self.display_page_controls = True

    self.request = request
    return list(self.page)

Я поместил два оператора печати, до и после list(self.page). Как видно из приведенных ниже операторов печати, return list(self.page) занимает много времени.

[Sun Sep 19 10:49:44.066406 2021] [pid 108994] File: pagination.py, Class: PageNumberPagination, Function: paginate_queryset. **Before list(self.page)**. self.page= <Page 1 of 223291>

[Sun Sep 19 11:08:21.092237 2021] [pid 108994] File: pagination.py, Class: PageNumberPagination, Function: paginate_queryset. **After list(self.page)**.

Как вы можете видеть, list(self.page) занял почти 20 минут, и я думаю, что ответ 500 происходит из-за этого. Как я могу решить эту проблему и гарантировать, что клиент, запрашивающий REST API, получит ответ, даже если это займет 20 минут.

Могу ли я установить некоторый таймаут в base.py или где-либо еще? Если да, то как это сделать?

REST_FRAMEWORK = {
    'PAGE_SIZE': 10,
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',

    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
    'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}

SWAGGER_SETTINGS = {
    "exclude_namespaces": [],  # List URL namespaces to ignore
    "api_version": '0.1',  # Specify your API's version
    "api_path": "/",  # Specify the path to your API not a root level
    "api_key": '',  # An API key
    "is_authenticated": False,  # Set to True to enforce user authentication,
    "is_superuser": False,  # Set to True to enforce admin only access
    'VALIDATOR_URL': None,
}
Вернуться на верх