Исключение RequestAborted

Исключение RequestAborted возникает в Django при обработке HTTP-запросов, когда клиент преждевременно закрывает соединение или когда сервер прерывает выполнение запроса из-за превышения допустимого времени обработки. Это исключение наследуется от SuspiciousOperation и относится к модулю django.core.exceptions. Оно используется системой для корректной обработки прерванных запросов и предотвращения бесконечного выполнения тяжелых операций.

Основные причины возникновения RequestAborted: клиент разорвал соединение (например, закрыл вкладку браузера или нажал кнопку "Стоп"), превышено время ожидания ответа от сервера, произошел сбой в сетевом соединении или был прерван процесс загрузки больших файлов. Django автоматически обрабатывает это исключение в промежуточном слое и прерывает выполнение текущего представления, но разработчик может перехватывать его для выполнения дополнительных действий.

Синтаксис

pythonfrom django.core.exceptions import RequestAborted

class RequestAborted(SuspiciousOperation):
  pass

Пример

Давайте перехватим исключение RequestAborted в представлении и выполним очистку ресурсов:

pythonfrom django.core.exceptions import RequestAborted
from django.http import JsonResponse
from django.views import View

class LongProcessView(View):
  def get(self, request):
    try:
      # Simulate long processing
      for i in range(100):
        # Check if request was aborted
        if not request.is_connected():
          raise RequestAborted("Client disconnected")
        # Process data
        ...
      return JsonResponse({"status": "success"})
    except RequestAborted as e:
      # Cleanup resources and log
      print(f"Request aborted: {e}")
      return JsonResponse(
        {"error": "Request was aborted"},
        status=499
      )

Пример

Рассмотрим использование RequestAborted при загрузке больших файлов:

pythonfrom django.core.exceptions import RequestAborted
from django.http import StreamingHttpResponse
import time

def file_upload_view(request):
  if request.method == "POST":
    try:
      chunk_size = 1024 * 1024  # 1 MB
      total_chunks = 0
      
      for chunk in request.FILES["file"].chunks(chunk_size):
        total_chunks += 1
        # Check connection status
        if not request.is_connected():
          raise RequestAborted("Upload interrupted")
        
        # Process chunk
        ...
        
      return JsonResponse({
        "message": "File uploaded",
        "chunks": total_chunks
      })
    except RequestAborted:
      # Clean up partially uploaded file
      return JsonResponse(
        {"error": "Upload aborted by user"},
        status=499
      )
  return JsonResponse({"error": "Method not allowed"}, status=405)

Результат выполнения кода при прерывании загрузки:

python{"error": "Upload aborted by user"}

Пример

Использование RequestAborted в промежуточном слое для логирования прерванных запросов:

pythonfrom django.core.exceptions import RequestAborted
from django.utils.deprecation import MiddlewareMixin
import logging

logger = logging.getLogger(__name__)

class AbortMonitoringMiddleware(MiddlewareMixin):
  def process_exception(self, request, exception):
    if isinstance(exception, RequestAborted):
      logger.warning(
        f"Request aborted for path: {request.path} "
        f"from IP: {request.META.get('REMOTE_ADDR')}"
      )
      # Cleanup any resources
      return None

Смотрите также

  • исключение SuspiciousOperation,
    которое является базовым для RequestAborted
  • исключение BadRequest,
    которое возникает при некорректном HTTP-запросе
  • исключение RequestDataTooBig,
    которое возникает при превышении размера запроса
  • исключение DisallowedHost,
    которое возникает при запросе с запрещенного хоста