@expose
Материал из PythonWiki.
@expose()
Декоратор expose сообщает CherryPy что вы хотите, чтобы данный метод был доступен через web, описывает формат выходных данных вашего метода, и автоматически начинает/останавливает транзакцию в тех базах данных, что поддерживают транзакции.
Основное использоваение
Добавляя декоратор expose без параметров вы говорите что метод будет доступен через web, и вы будете сами формировать содержимое документа и устанавливать заголовки http ответа:
@expose()
Более часто используется форма с
указанием шаблона:@expose("projectname.templates.baz")
Либо вернуть в словаре установленный ключ:
return dict(tg_template="projectname.templates.baz")
В этом случае ожидается, что ваш метод возвращает словарь. Значения словаря будут доступны в шаблоне. В большинстве систем шаблонов пары ключ/значение доступны в виде локальных переменных в области видимости шаблонов. Другими словами, возвращая из метода {'a':2} вы заменяет все ${a} в шаблоне на 2.
Подсказка: Если значения, которые вы хотите использовать в шаблоне уже существут в области видимости вашего методо, можете просто написать return locals().
Шаблон на который мы ссылались выше ("projectname.templates.baz") будет использовать шаблонную систему назначенную по умолчанию для приложения -- по умолчанию это Kid. Чтобы использовать другую систему шаблонов для метода поместите имя системы перед именем шаблона, отделив двоеточием
@expose("cheetah:foo.templates.plaintext")
Иногда шаблонные системы не нуждаются в файле шаблона. Так работает, например, вывод в формате JSON. В таком случае указыватся только имя системы шаблонов:
@expose("json")
Один метод, Различные шаблоны
Вы можете передовать, возвращаемый методом словарь, его в различные шаблонные системы и получать отличающиеся результаты:
@expose("projectname.templates.baz") @expose("json", as_format="json", accept_format="text/javascript") def yourmethod(self): return dict(a_value="something")
Если в неизменяли шаблон по умолчанию для приложения, словарь будет передан в шабон projectname/templates/baz.kid Kid. С другой стороны, если yourmethod будет вызван с параметром "tg_format=json" или будет установлен "Accept: text/javascript" в заголовке http-запроса, данные будт
возвращены в формате JSON.Поскольку формат JSON очень часто используется в Ajax операциях, существует короткая форма декоратора для добавления вывода в JSON:
@expose("foo.templates.baz", allow_json=True) def yourmethod(self): return dict(a_value="something")
Этот пример эквивалентен предыдущему.
Разумеется, вы можете не ограничиватся, только шаблоном по умолчанию и выводом в JSON. Если вы хотите использовать Kid для вывода в HTML и использовать Cheetah для текстового формата, добавте следующее:
@expose("cheetah:projectname.templates.plaintext", as_format="plain", accept_format="text/plain" content_type="text/plain")
Если метод получит параметр "tg_format=plain" (параметр as_format декоратора управляет этим) или с "Accept: text/plain" в заголовке http-запроса (парамет accept_format управляет этим), то будет использоваться система шаблонов Cheetah для вывода тестовой версии этой страницы. Если опустить content_type, документ будет передан с text/html MIME типом. Большинство клиентов могут обрабатывать текстовые документы с неверным MIME типом, но если используете шаблонную систему, возвращающую нетекстовый документ, а, например, PDF или PNG, вам необходимо устанавливать MIME тип
корректно.В заключении, некотрые шаблонные системы, тот-же Kid, могут использовать шаблон для вывода в разных форматах. Параметрformat управляет тем, в каком формате будет выводится шаблон. Для Kid, доступны варианты "html" (по умолчанию), "xml", и "xhtml".
размещено с разрешения автора перевода Олега Комкова (http://python.com.ua/forum/profile.php?id=136)

