в чем причина того, что python-eve отбрасывает параметры поиска в операциях POST?

Я хотел бы использовать параметры запроса в POST и других методах модификации. Это может относиться к обычным параметрам запроса или к тем, которые извлекаются с помощью правил URL с переменными. Но я заметил, что Ева специально отбрасывает эти параметры для вызовов POST. Я могу легко внести изменения, необходимые для их сохранения, но, поскольку они преднамеренно удаляются, мне интересно, есть ли какие-то недостатки в их наличии. Чем обусловлено такое дизайнерское решение?

Пример использования

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

DELETE /resource/123
    -- fails if there are dependent objects for this resource
DELETE /resource/123?cascade=true  
    -- allow delete to cascade to dependent objects (eg. user clicked "I am sure")

Другой пример:

POST /user?allowId=True  { "id" : 123, "name" : "Bob }
    -- will accept externally-defined ID as opposed to generating a new one

Другой пример:

POST /container/<foo>/resource    { ... }
    -- create a new resource inside of the <foo> container

Отредактировано

Я попытался использовать request.args, чтобы получить правила для переменных, но, похоже, это не сработало. (Таким образом можно получить аргументы запроса, но я бы хотел, чтобы правила для переменных также работали.)

*in settings.py*
DOMAIN = {
    'ducks' : {
        'url':'rows/<row>/ducks',
        'schema': {
            'name' : { 'type' : 'string' }
        }
    }
}

*command line*
curl -H "Content-Type: application/json" -X POST 'http://localhost:5001/rows/1/ducks' -d '{"name":"bob"}

Когда код входит в мой хук on_pre_POST, request.args пуст. Если я пройдусь по стеку, я увижу, что в endpoints.collection_endpoint() функция lookup действительно содержит {'row':1}, но не передается в вызов post(response). Я могу отправить запрос на включение, чтобы исправить это, если это имеет смысл.

Отредактировано 2

Я обнаружил, что эти параметры доступны в request.view_args, а не в request.args. Это означает, что оба типа параметров доступны в любом месте flask/eve без изменения кода.


person Dmitry Serebrennikov    schedule 06.11.2014    source источник


Ответы (1)


Поскольку on_pre_POST передает объект запроса, вы можете легко добиться этого:

def my_pre_post_callback(resource, request):
    allowId = request.args.get('allowId')
    ...
person Nicola Iarocci    schedule 07.11.2014
comment
Хорошо, приятно знать. Я не думал об этом. Это также работает с переменными правилами (такими как ‹foo› в моем примере)? Кроме того, мой вопрос остается в силе - что движет дизайнерским решением не включать их в поиск единообразно для всех методов? - person Dmitry Serebrennikov; 08.11.2014
comment
Да, это работает с вложенными конечными точками. Просто редко используются аргументы запроса с POST, или, по крайней мере, я лично никогда не видел, чтобы они использовались таким образом. - person Nicola Iarocci; 08.11.2014