From 48cd99c6f6582d0fc7ffbd120ebfe9c4500efdf5 Mon Sep 17 00:00:00 2001 From: Tim-Oliver Husser Date: Wed, 30 Jun 2021 20:00:02 +0200 Subject: [PATCH] limit results and return len of results, not data, which vastly improves speed --- pyobs_archive/api/views.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/pyobs_archive/api/views.py b/pyobs_archive/api/views.py index 8e9d342..66bb9f6 100644 --- a/pyobs_archive/api/views.py +++ b/pyobs_archive/api/views.py @@ -1,8 +1,10 @@ import io +import json import os import logging import datetime import math +import time import numpy as np import zipstream @@ -12,6 +14,7 @@ from django.conf import settings from django.db.models import F from rest_framework.decorators import permission_classes, api_view +from rest_framework.exceptions import ParseError from rest_framework.permissions import IsAdminUser, IsAuthenticated from pyobs_archive.api.models import Frame @@ -147,8 +150,15 @@ def filter_frames(data, request): @permission_classes([IsAuthenticated]) def frames_view(request): # get offset and limit - offset = request.GET.get('offset', default=None) - limit = request.GET.get('limit', default=None) + try: + offset = int(request.GET.get('offset', default=0)) + limit = int(request.GET.get('limit', default=1000)) + except ValueError: + raise ParseError('Invalid values for offset/limit.') + + # limit to 1000 + limit = max(0, min(limit, 1000)) + offset = max(0, offset) # sort sort = request.GET.get('sort', default='DATE_OBS') @@ -162,14 +172,10 @@ def frames_view(request): data = filter_frames(data, request) # get results - if offset is None or limit is None: - results = [frame.get_info() for frame in data] - else: - results = [frame.get_info() for frame in data[int(offset):int(offset) + int(limit)]] + results = [frame.get_info() for frame in data[int(offset):int(offset) + int(limit)]] # return them - return JsonResponse({'count': len(data), - 'results': results}) + return JsonResponse({'count': len(results), 'results': results}) @api_view(['GET'])