Как использовать patch_internal

В моем приложении у меня есть хук, который должен обновлять поле в ресурсе: в другом post кто-то использовал метод patch_internal, но я не понял, как.

from my_application import app
from eve.methods.patch import patch_internal

def my_hook(...):
    with app.test_request_context():
        patch_internal("my_resource", payload={"bar": "bar_value"}, lookup={"foo": "foo_value"})

Я пытался использовать PRESERVE_CONTEXT_ON_EXCEPTION = False в settings.py.

В зависимости от того, как я пытаюсь это сделать, я получаю либо

  • 404 для исходного запроса, который в первую очередь вызвал хук,

  • или AssertionError:

.

Debugging middleware caught exception in streamed response at a point where response headers were already sent.
Traceback (most recent call last):
  File ".../lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File ".../lib/python2.7/site-packages/flask/app.py", line 1825, in wsgi_app
    ctx.auto_pop(error)
  File ".../lib/python2.7/site-packages/flask/ctx.py", line 374, in auto_pop
    self.pop(exc)
  File ".../lib/python2.7/site-packages/flask/ctx.py", line 357, in pop
% (rv, self)
AssertionError: Popped wrong request context.
(<RequestContext 'http://127.0.0.1:5001/' [GET] of eve> instead of <RequestContext 'http://127.0.0.1:5001/my_endpoint' [GET] of eve>)

Мой вопрос:

Каковы правильные параметры для patch_internal? Как мне сказать Еве, какой предмет я хочу изменить?


eve
person otibsa    schedule 06.02.2015    source источник
comment
Чтобы уточнить: foo это unique и required (но я также пробовал поиск с помощью '_id: ObjectId(...)` , и элемент, который я хочу изменить, существует в базе данных,   -  person otibsa    schedule 06.02.2015


Ответы (1)


Это тривиальный пример, который должен работать:

from eve import Eve
from eve.methods.patch import patch_internal


app = Eve()

def my_hook(*args):
    with app.test_request_context():
        payload = {"bar": "bar_value"}
        lookup = {"_id": "4f71e038c88e201118000002"}
        patch_internal("my_resource", payload, **lookup)


# this is rather stupid. We're going to patch the same document on *every* GET request, but you get the point
app.on_post_GET += my_hook


if __name__ == '__main__':
    app.run()

Или вы можете проверить внутренний тест исправления для чуть более четкого примера. Также вот хороший пример post_internal. Надеюсь это поможет.

person Nicola Iarocci    schedule 07.02.2015
comment
Спасибо! Я предполагаю, что проблема была связана с питоном, а не с кануном, связанным с **lookup - person otibsa; 07.02.2015
comment
@nicola, зачем использовать test_request_context вместо request_context? - person Gustavo Vargas; 09.10.2016