【问题标题】:(Django) A request was passed with missing value for 'category' which the code could not process. I need to catch this exception and handle it(Django) 传递了一个请求,其中缺少代码无法处理的“类别”值。我需要捕捉这个异常并处理它
【发布时间】:2018-10-04 02:18:17
【问题描述】:

在 api 请求中传递了负值时引发了 AssertionError:

AssertionError: Negative indexing is not supported.
  File "django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "newrelic/hooks/framework_django.py", line 544, in wrapper
    return wrapped(*args, **kwargs)
  File "api/views.py", line 1811, in lots
    sale_id
  File "api/views.py", line 1684, in lots_v1
    datetime_now
  File "api/views.py", line 1409, in get_lot_items
    lots = paginator.page(page)
  File "django/core/paginator.py", line 62, in page
    return self._get_page(self.object_list[bottom:top], number, self)
  File "django/db/models/query.py", line 269, in __getitem__
    "Negative indexing is not supported." 

这很可能导致向用户显示“无限旋转轮”,因为由于后端错误,请求从未完成。

我需要捕获并处理这些不正确的 url 参数值。

下面是分页器的定义: `def get_lot_items( 很多, 页, 页面长度, 货币字典, iClient没有, 销售完成, 类别, 销售状态, 认证, 约会时间 ): # 从 db 查询集中创建很多项

# paginate the lots
paginator = Paginator(lots, page_length)
try:
    lots = paginator.page(page)
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    lots = paginator.page(1)
except EmptyPage:
    # If page is out of range, deliver last page of results.
    lots = paginator.page(paginator.num_pages)

items = []
flagged_items_collection = {}
if iClientNo:
    flagged_items_collection = get_flagged_items_collection2(
        iClientNo,
        lot_ids=[_lot.iSaleLotNoUnique for _lot in lots]
    )`

还有page_length定义为:

page_length = request.GET.get('length', None) try: page_length = int(page_length) except (ValueError, TypeError): page_length = None

PAGE_LENGTH_DEFAULT = {'grid': 36, 'list': 10, 'results': 90}
if not page_length:
    try:
        page_length = PAGE_LENGTH_DEFAULT[category]
        status = 200
        msg = 'Everything is ok'
    except ValueError as e:
        pass`

【问题讨论】:

  • 是的,您需要完全按照您的描述进行操作。你的“问题”有什么问题吗?
  • 您正在显示回溯,您可以发布您的代码吗?

标签: python django python-2.7 django-models


【解决方案1】:

每当您尝试使用负索引索引 Django Queryset 时,都会引发此错误。这是源代码sn-p:

def __getitem__(self, k):
    """
    Retrieves an item or slice from the set of results.
    """
    if not isinstance(k, (slice,) + six.integer_types):
        raise TypeError
    assert ((not isinstance(k, slice) and (k >= 0)) or
            (isinstance(k, slice) and (k.start is None or k.start >= 0) and
             (k.stop is None or k.stop >= 0))), \
        "Negative indexing is not supported."

很可能;导致此问题的行是:

return self._get_page(self.object_list[bottom:top], number, self)

bottomtop 的值为负数。您在分页器类中的per_page 配置是什么?

【讨论】:

  • 谢谢你,虽然我最初也是 QuerySet 上的负索引,但我将在分页类中发布我的per_page 配置。 @rtindru
  • 这里是分页器的代码:paginator = Paginator(lots, page_length) try: lots = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. lots = paginator.page(1) except EmptyPage: # If page is out of range, deliver last page of results. lots = paginator.page(paginator.num_pages)
  • 您可以将其添加到您的问题中吗?格式化是 cmets 中的一个问题
  • 另外,page_lengthpaginator = Paginator(lots, page_length) 中的定义是什么?
猜你喜欢
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2020-03-28
  • 2021-06-29
  • 2020-12-09
  • 2015-05-10
相关资源
最近更新 更多