2015-07-06 2 views
0

Если этот фильтр REST результатов запроса в каких-либо значений будет возвращать HTTP 200 с пустыми результатами:404, когда номер слишком высока

http://server/path/entities?field=value&page=1 

Это один возвращает HTTP 404 вместо

http://server/path/entities?field=value&page=2 

Очевидно, что нет второй страницы результатов. Могу ли я настроить django-rest для возврата пустого HTTP 200, а не HTTP 404 в этом сценарии?

GUI позволяет пользователю перейти на страницу вперед, а затем изменить критерии фильтрации, которые могут запрашивать второй URL-адрес и запускать HTTP 404 и пользовательскую ошибку.

Я могу попросить команду GUI обрабатывать 404 как пустой набор результатов, но я бы предпочел, чтобы это просто возвращало пустой HTTP 200 с сервера.

ответ

1

Вы можете создать пользовательский класс постраничного что перехватывать NotFound исключения поднять в paginate_queryset() и возвращать пустой список вместо

что-то вроде этого

def paginate_queryset(self, queryset, request, view=None): 
    """Checking NotFound exception""" 
    try: 
     return super(EmptyPagination, self).paginate_queryset(queryset, request, view=view) 
    except NotFound: # intercept NotFound exception 
     return list() 

def get_paginated_response(self, data): 
    """Avoid case when self does not have page properties for empty list""" 
    if hasattr(self, 'page') and self.page is not None: 
     return super(EmptyPagination, self).get_paginated_response(data) 
    else: 
     return Response(OrderedDict([ 
      ('count', None), 
      ('next', None), 
      ('previous', None), 
      ('results', data) 
     ])) 

и в конфигурационном файле

просто сказать DRF использовать этот пользовательский класс разбивки на страницы

'DEFAULT_PAGINATION_CLASS': 'apps.commons.serializers.EmptyPagination', 
0

Это невозможно (легко), потому что 404 запускается в результате of a NotFound exception being raised, который вырвется из логики разбиения на страницы. You может специальный случай NotFound исключение в a custom exception handler, но вы будете гадать на основе строки подробностей. Это не самая лучшая идея, поскольку сообщение может измениться, если

  • Сообщение изменено в основных переводах DRF
  • Вашего приложение используют переведенные строки

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

Вам будет лучше, если ваша команда GUI будет обрабатывать 404 в качестве пустого результата или у вас есть сбрасывает номер страницы при изменении фильтрации.

Смежные вопросы