页码太高时404

时间:2015-07-06 16:30:49

标签: pagination django-rest-framework

如果此过滤器REST查询未生成任何值,则会返回带有空结果的HTTP 200:

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。

2 个答案:

答案 0 :(得分:2)

您可以创建一个自定义分页类来拦截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',

答案 1 :(得分:0)

这不是(容易)可能的,因为404将作为结果of a NotFound exception being raised被触发,这将从分页逻辑中突破。您可以特殊情况下a custom exception handler中的NotFound例外,但您将根据详细信息字符串进行猜测。这不是最好的主意,因为如果

,消息可能会改变
  • DRF核心翻译中的消息已更改
  • 您的应用程序正在使用已翻译的字符串

这意味着您的应用程序将在以后的某个时间点突然返回到提升404。

最好让GUI团队将404视为空结果,或者让过滤器更改时让重置页码