Отмена долгосрочного запроса в Django - PullRequest
1 голос
/ 21 апреля 2020

Я хочу прервать запрос к API, который занимает более 5 секунд. Я знаю, что код на стороне клиента может иметь время ожидания 5 секунд, и это гарантирует, что он не будет ждать дольше, чем это, чтобы получить ответ, но сервер Django все равно будет обрабатывать запрос, даже если клиент выиграл ' не получить его в конце. Насколько я знаю, даже если я настрою это на nginx или gunicorn, они все равно будут действовать как клиенты для серверного приложения Django, и возникнет та же проблема - что nginx не будет ждать более 5 секунд , но Django продолжит обработку запроса.

Можно ли как-нибудь прервать обработку этого запроса на самом * Django (уровне кода сервера приложений)?

Для контекста на конкретный c вариант использования: этот API анализирует файл, и у нас есть ограничение на размер 5 МБ для этого файла. Даже тогда, по некоторым причинам, иногда анализ файла занимает более 20-30 секунд, поэтому мы хотим прервать запрос этого API, если он превышает определенный порог.

1 Ответ

0 голосов
/ 22 апреля 2020

Вы должны вызвать указанное исключение c через определенное время.

Чтобы всегда возвращать одну и ту же ошибку, вы можете использовать пользовательский обработчик ошибок .

from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    if isinstance(exc, MyTimeoutException):
        return Response(
            {'detail': 'Your request timed out.'},
            status=status.HTTP_408_REQUEST_TIMEOUT)

    response = exception_handler(exc, context)


    return response
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}
...