python накануне — вернуть ответ по предварительному запросу

Я разрабатываю rest-api, используя python-eve. Мой объект содержит URL, описание и изображение. Пользователи могут либо вставлять, либо просматривать товар (для вставки пользователь просто добавляет URL-адрес, и генерируются описание и изображение).

Во избежание повторных обновлений - когда пользователь вставляет URL-адрес, который уже существует, используя запрос POST, я хотел бы перенаправить его на URL-адрес элемента, соответствующего этому URL-адресу. Для этого я добавил этот код:

def pre_post_callback(request, lookup):
    prev_object = current_app.data.driver.db['products'].find_one({"url":lookup.values['url']})
    if prev_object:
      # here I would like to redirect the user to the /product/id of the product corresponding.

app.on_pre_POST += pre_post_callback

Однако при добавлении одного и того же URL-адреса дважды я продолжаю добавлять (переопределять) существующий элемент.

Как перенаправить пользователя к уже существующему продукту из хука обратного вызова до и после публикации?


person eve.question    schedule 27.10.2016    source источник
comment
Вы уверены, что здесь работает lookup? документы говорят следующее: Callbacks will receive the resource being requested, the original flask.request object and the current lookup dictionary as arguments (only exception being the on_pre_POST hook which does not provide a lookup argument).   -  person HassenPy    schedule 28.10.2016
comment
и какой код в вашем блоке if prev_object   -  person HassenPy    schedule 28.10.2016
comment
Код в условии if обычно был перенаправлением, однако он не работал. Мой вопрос: как мне вернуть ответ на этом этапе (в этом условии if)?   -  person eve.question    schedule 28.10.2016


Ответы (1)


Если я вас хорошо понимаю, вы хотите ответить на запрос POST (запись) ответом, подобным поиску. В REST вы действительно не хотите этого делать, и Eve (будучи фреймворком REST) ​​не очень подходит для этого, хотя вы, вероятно, могли бы добиться аналогичного результата с помощью некоторого взлома.

Что вы, вероятно, сделаете в своем случае, так это установите правило unique для поля url, поэтому POST в конечном итоге получит ответ 409 Conflict.

person Nicola Iarocci    schedule 29.10.2016
comment
я не уверен, так как когда URL-адрес вставленного элемента не существует - я хотел бы продолжить и создать его, а если это не так - я хотел бы вернуть ответ GET для объекта, который существует с этим URL-адресом - person eve.question; 29.10.2016
comment
Если он не существует, POST создаст его. Вы получите 429 только тогда, когда / если URL-адрес уже существует. - person Nicola Iarocci; 30.10.2016
comment
Я понимаю, что я применил хук, чтобы проверить, существует ли он уже, и если он существует, вернуть старый объект, который уже существует. как мне это сделать вместо получения 429 - person eve.question; 30.10.2016