2015-12-23 3 views
2

Я пытаюсь создать маршрут Pyramid для запроса PUT в RESTful API для создания нового ресурса. Мое приложение использует обход, который работает отлично подходит для GET и POST:Прохождение пирамиды для запросов PUT

config.add_route('myroute', '/resources/*traverse') 

PUT С должен иметь новое имя ресурса в URL это, очевидно, не работает с PUT, поскольку существует неизвестный ресурс в конце так обход неудачи. Я пытался создать новый маршрут для PUT с использованием гибридной URL отправки и обходом подхода:

config.add_route('myroute_put', '/resources/{path}/{new}', traverse='/{path}', request_method='PUT') 

Это прекрасно работает, если и только если существует только сегмент пути обхода. Название нового ресурса доступен как request.matchdict['new'] Если мы на уровне корня, ни с чем пройти, мы все еще можем получить эту работу, сделав вспомогательный маршрут:

config.add_route('myroute_put_root', '/resources/{new}', reqeust_method='PUT') 

Однако, это не реальное решение потому что myroute_put еще не соответствует, если есть более одного сегмента пути, которые должны быть пройдена, например, для URL: /resources/path1/path2/new_resource

ответ

2

Это переполнение стека вопрос: Pyramid traversal HTTP PUT to a URI that doesn't exist предлагает решение для создания другого NewResource типа контекста для представления новых ресурсов. Метод __getitem__() класса Resource может тогда всегда возвращать NewResource, если он не может найти запрошенный ребенок. Затем можно настроить конфигурацию вида для контекста NewResource и PUT request_method.

Это почти работает, за исключением того, всегда возвращающая NewResource когда ребенок не найден, а не поднимать KeyError она нарушает способность использовать именованные виды, как URL подчиненных. Например, URL: /resources/path1/path2/my_view ошибочно вернул бы контекст NewResource для my_view вместо того, чтобы использовать это как имя_выхода, если он существует.

Лучшим обходным решением этой проблемы, которое я нашел до сих пор, было создание пользовательского алгоритма трассировки пирамиды, который сначала использует алгоритм обхода по умолчанию, но если это не удается, он проверяет, является ли request.methodPUT. Если это так, то он возвращает контекст NewResource, в противном случае он возвращает результаты обхода как есть.

Смежные вопросы