Как создать метод контроллера в Turbogears, который можно вызывать из контроллера или визуализировать с помощью шаблона - PullRequest
1 голос
/ 18 января 2009

Если у вас есть такой метод контроллера:

@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)? Почему при вызове этого метода из того же класса, например ::10000

artists = self.artists()

Вы получаете строку json, когда это уместно, только если метод вызывается как часть HTML-запроса. Что я пропустил?

1 Ответ

1 голос
/ 18 января 2009

Обычно я подхожу к этому, имея «рабочий» метод, который запрашивает базу данных, преобразует результаты и т. Д., А также отдельный метод предоставления, со всеми необходимыми декораторами. E.g.:

# 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)
...