Как создать метод контроллера в Turbogears, который можно вызывать из контроллера или визуализировать с помощью шаблона
Если у вас есть метод контроллера, например, так:
@expose("json")
def artists(self, action="view",artist_id=None):
artists=session.query(model.Artist).all()
return dict(artists=artists)
Как вы можете вызвать этот метод из вашего класса контроллера и получить обратно python dict, а не json-закодированную строку dict (которая требует, чтобы вы декодировали его из json обратно в python dict). Действительно ли необходимо написать одну функцию для извлечения данных из вашей модели, а другую - для упаковки этих данных для использования шаблонами (KID, JSON)? Почему при вызове этого метода из того же класса, например:
artists = self.artists()
Вы получаете строку json, когда это уместно, только если метод вызывается как часть HTML-запроса. Что я пропустил?
1 ответ
Обычно я подхожу к этому, имея метод "работника", который запрашивает базу данных, преобразует результаты и т. Д., И имеет отдельный метод экспонирования со всеми необходимыми декораторами. Например:
# The _artists method can be used from any other method
def _artists(self, action, artist_id):
artists = session.query(model.Artist).all()
return dict(artists=artists)
@expose("json")
#@identity.require(identity.non_anonymous())
# error handlers, etc.
def artists(self, action="view", artist_id=None):
return self._artists(action=action, artist_id=artist_id)