Flask / Pymongo / Restplus - при использовании update (** data) я получаю «IndexError: список index вне диапазона» - PullRequest
1 голос
/ 03 марта 2020

Flask == 1.1.1 pymongo == 3.10.1 flask -restplus == 0.13.0

Я пытаюсь выдвинуть JSON на URL и использовать update(), но я сталкиваюсь с проблемой. В Routs.py у меня есть простая настройка API ...

@api.route('/api/content/<idx>')
class UpdateContent(Resource):

    def put(self,idx):
        data = api.payload
        Content.objects(content_id=idx).update(**data)
        return jsonify(Content.objects(content_id=idx))

Используя Почтальон, я помещаю в / api / content / 2

  {
    "content_id": 2,
    "title": "Test 2",
    "description": "Test 2"
  }

И я получаю это ...

Traceback (most recent call last):
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 2463, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask_restplus/api.py", line 584, in error_router
    return original_handler(e)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask_restplus/api.py", line 584, in error_router
    return original_handler(e)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/_compat.py", line 38, in reraise
    raise value.with_traceback(tb)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask_restplus/api.py", line 325, in wrapper
    resp = resource(*args, **kwargs)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask/views.py", line 89, in view
    return self.dispatch_request(*args, **kwargs)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/flask_restplus/resource.py", line 44, in dispatch_request
    resp = meth(*args, **kwargs)
  File "/Users/jyoseph/Sites/testsite/application/routes.py", line 31, in put
    Content.objects(content_id=idx).update(**data)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/mongoengine/queryset/base.py", line 521, in update
    update = transform.update(queryset._document, **update)
  File "/Users/jyoseph/Sites/testsite/venv/lib/python3.8/site-packages/mongoengine/queryset/transform.py", line 303, in update
    field = cleaned_fields[-1]
IndexError: list index out of range

Я не могу понять, что может быть причиной этой проблемы. Если я изменю код для передачи каждого свойства по отдельности, он будет работать нормально ...

    def put(self,idx):
        data = api.payload
        Content.objects(content_id=idx).update(content_id=data['content_id'], title=data['title'], excerpt=data['excerpt'], description=data['description'])
        return jsonify(Content.objects(content_id=idx))

Но это не идеально. Я надеялся использовать ** для распаковки переданного объекта данных.

1 Ответ

1 голос
/ 06 марта 2020

Вероятно, возникшая у вас проблема связана с тем, что data имеет дополнительные ключи, которые не существуют в виде полей в объекте.

При использовании распаковки словаря убедитесь, что все ключи которые будут распакованы в аргументы, действительно находятся в обновляемом объекте MongoDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...