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,
}