404 when page number is too high

cla*_*lay 4 pagination django-rest-framework

如果此过滤器 REST 查询没有产生任何值,它将返回带有空结果的 HTTP 200:

http://server/path/entities?field=value&page=1
Run Code Online (Sandbox Code Playgroud)

这个将返回 HTTP 404

http://server/path/entities?field=value&page=2
Run Code Online (Sandbox Code Playgroud)

显然,没有第二页结果。在这种情况下,我可以配置 django-rest 返回空的 HTTP 200,而不是 HTTP 404 吗?

GUI 允许用户向前翻页,然后更改过滤条件,这可以请求第二个 URL 并触发 HTTP 404 和用户错误。

我可以要求 GUI 团队将 404 视为空结果集,但我宁愿这只是从服务器返回空 HTTP 200。

Sai*_*ail 7

您可以创建一个自定义分页类来拦截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)
        ]))
Run Code Online (Sandbox Code Playgroud)

并在配置文件中

只需告诉 DRF 使用此自定义分页类

'DEFAULT_PAGINATION_CLASS': 'apps.commons.serializers.EmptyPagination',
Run Code Online (Sandbox Code Playgroud)