如果此过滤器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。
答案 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
例外,但您将根据详细信息字符串进行猜测。这不是最好的主意,因为如果
这意味着您的应用程序将在以后的某个时间点突然返回到提升404。
最好让GUI团队将404视为空结果,或者让过滤器更改时让重置页码。