【问题标题】:404 when page number is too high页码过高时出现 404
【发布时间】:2015-07-29 16:32:31
【问题描述】:

如果此过滤器 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。

【问题讨论】:

    标签: pagination django-rest-framework


    【解决方案1】:

    您可以创建一个自定义分页类,拦截paginate_queryset() 中的NotFound 异常引发并返回空列表

    类似的东西

    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',
    

    【讨论】:

    • 别忘了导入以下内容:from rest_framework.exceptions import NotFound, from rest_framework.response import Response, from collections import OrderedDict
    【解决方案2】:

    这是不可能的,因为 404 被触发为结果of a NotFound exception being raised,这将脱离分页逻辑。您可以a custom exception handler 中对NotFound 异常进行特殊处理,但您将根据详细字符串进行猜测。这不是最好的主意,因为如果

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

    这意味着您的应用程序将在未来某个时候突然返回引发 404。

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

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2017-12-17
      相关资源
      最近更新 更多