Ответ
Для передачи больших наборов данных с бэкенда на фронтенд используются три основные стратегии: пагинация, потоковая передача и сжатие. Выбор зависит от требований к интерактивности, объему данных и нагрузке на сервер.
1. Пагинация (Paging)
Самый распространенный подход. Данные делятся на небольшие порции (страницы), которые фронтенд запрашивает по мере необходимости.
- Как работает: Клиент запрашивает данные, указывая номер страницы и ее размер (например,
/api/items?page=2&size=50). - Плюсы: Предсказуемая нагрузка на сервер и клиент, простота реализации, стандарт для UI.
- Минусы: Не подходит для экспорта данных; требует нескольких запросов для получения всего набора.
Пример на Django:
from django.core.paginator import Paginator
from django.http import JsonResponse
def get_items(request):
item_list = Item.objects.all()
# Делим на страницы по 50 элементов
paginator = Paginator(item_list, 50)
page_number = request.GET.get('page', 1)
page_obj = paginator.get_page(page_number)
return JsonResponse({
'total_pages': paginator.num_pages,
'items': list(page_obj.object_list.values())
})
2. Потоковая передача (Streaming)
Данные передаются непрерывным потоком по мере их готовности на сервере. Идеально для экспорта файлов (CSV, JSON Lines) или отображения данных в реальном времени.
- Как работает: Сервер отправляет ответ с заголовком
Transfer-Encoding: chunked, и данные передаются частями. - Плюсы: Низкое потребление памяти на сервере, быстрая отдача первой части данных.
- Минусы: Сложнее в реализации на клиенте, трудно отслеживать прогресс.
Пример на FastAPI (для скачивания CSV):
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import io
app = FastAPI()
async def fake_data_streamer():
# Эмуляция получения данных из БД
yield 'id,namen' # Заголовок CSV
for i in range(10000):
yield f'{i},Item {i}n'
@app.get("/stream-csv")
async def stream_csv():
return StreamingResponse(fake_data_streamer(),
media_type="text/csv",
headers={'Content-Disposition': 'attachment; filename=data.csv'})
3. Сжатие (Compression)
Этот метод уменьшает размер передаваемых данных и используется в дополнение к пагинации или стримингу. Обычно настраивается на уровне веб-сервера (Nginx, Apache) с помощью gzip или brotli.
- Как работает: Веб-сервер сжимает HTTP-ответ перед отправкой, а браузер автоматически его распаковывает.
- Плюсы: Значительно сокращает трафик и время загрузки.
- Минусы: Небольшая дополнительная нагрузка на CPU сервера.
Вывод: Для интерактивных таблиц используйте пагинацию. Для экспорта больших файлов — потоковую передачу. Сжатие включайте всегда.