#python #pyramid #restful-architecture #akhet
#python #пирамида #restful-архитектура #ахет
Вопрос:
В настоящее время я переношу проект с Pylons 1.0 на Pyramid.
Моя проблема до сих пор заключается в том, как использовать restful routes в Pyramid. В настоящее время я использую pyramid_handlers, так как это показалось хорошим началом. Я использую Akhet.
Итак, вот две важные строки в моем маршруте:
config.add_handler("new_account", "/accounts/new", "sproci2.handlers.accounts:Accounts")
# or
config.add_handler("new_account", "/accounts/new", "sproci2.handlers.accounts:Accounts", action="new")
Мое действие:
@action(name="new_account", renderer='accounts/new.mako', request_method='GET')
Ошибки:
TypeError: 'Accounts' object is not callable
or
ValueError: Could not convert view return value "{}" into a response Object.
Учетные записи… пока все хорошо, легко понять, что pyramid_handlers, похоже, не регистрируется нормально или не обрабатывает имя, как должно … тем не менее request.matched_route
, у меня есть «new_account».
Если я добавлю «action =’new'» в определение маршрута, он найдет функцию, но не будет прослушивать определение действия. Другими словами, он не сможет найти средство визуализации и ожидать объект ответа. request_method
Параметр на самом деле еще ничего не делает, поэтому его удаление не меняет никаких результатов.
Короче говоря, @action(name="..."
не работает. Пирамиде не удается найти функцию самостоятельно, и если имя функции определено, ей не удается выполнить оператор действия.
Понятия не имею, что я делаю не так.
Правильный способ сделать это.
config.add_handler("new_account", "/accounts/new", "sproci2.handlers.accounts:Accounts", action="new_account")
Редактировать
route_name
вероятно, будет использоваться функциями генератора URL. В то время как action — это фактическое имя в @action . Как я понял, @action name было route_name, а не именем действия. Теперь это имеет больше смысла.
Ответ №1:
Ну, для вызова add_handler
требуется шаблон действия. Так что это либо добавление {action}
к шаблону URL, либо установка action=
в качестве аргумента. Эти действия должны соответствовать именам, определенным в @action
декораторах. В вашем примере вы назвали действие new_account
, но вы вызвали add_handler
с помощью действия new
. Таким образом, они неправильно подключены.
Комментарии:
1. Я ожидал другого поведения .. именем в действии будет маршрут, который должен совпадать, а не действие, которое должно совпадать.. Вероятно, он получил новую правильную функцию, поскольку именно так я ее назвал. Но ожидал ResponseObject, поскольку «новый» не был определен ни в одном @action… Теперь это имеет большой смысл.