Python 如何在Turbogears中创建控制器方法,该方法可以从控制器内调用,也可以使用模板呈现

Python 如何在Turbogears中创建控制器方法,该方法可以从控制器内调用,也可以使用模板呈现,python,json,turbogears,Python,Json,Turbogears,如果您有这样的控制器方法: @expose("json") def artists(self, action="view",artist_id=None): artists=session.query(model.Artist).all() return dict(artists=artists) 如何从控制器类中调用该方法,并获取python dict,而不是dict的json编码字符串(这需要您将其从json解码回python dict)。是否真的需要编写一个函数从模型中获

如果您有这样的控制器方法:

@expose("json")
def artists(self, action="view",artist_id=None):
    artists=session.query(model.Artist).all()
    return dict(artists=artists)
如何从控制器类中调用该方法,并获取python dict,而不是dict的json编码字符串(这需要您将其从json解码回python dict)。是否真的需要编写一个函数从模型中获取数据,另一个函数打包数据以供模板使用(KID、JSON)?为什么从同一类中调用此方法,例如:

artists = self.artists()
只有当该方法作为HTML请求的一部分被调用时,才会得到一个json字符串。
我错过了什么?

我通常通过使用一个“worker”方法(查询数据库、转换结果等)和一个单独的公开方法(包含所有必需的装饰器)来实现这一点。例如:

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

我通常通过使用一个“worker”方法(查询数据库、转换结果等)和一个单独的公开方法(带有所有必需的装饰器)来实现这一点。例如:

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

显然,这对于非常复杂的数据库查询来说更麻烦——不想在实用方法和控制器方法等之间重复所有这些,也不想有“无意义”的方法,这些方法只用于修饰现有的实用方法以供模板使用。我实际上想到的是“无意义”仅装饰的方法正好相反-TG中现成的装饰器范围可以使具有简单主体的方法变得非常强大。我还发现将逻辑拆分为工作函数对于单元测试很有用。对不起,通过decoration,我指的不是decorators的@error\u handler'等,而是代理方法、包装方法,不管你想调用它们什么。我完全同意re:TG装饰师的说法,他们真的很强大,很有表现力。Re:单元测试-是的,这确实是一个很好的观点。显然,这对于非常复杂的数据库查询来说更麻烦-不想在实用程序方法和控制器方法等之间重复所有这些,也不想有“无意义”的方法,这些方法只用于修饰现有的实用程序方法以供模板使用。I实际上,将“无意义”的装饰方法视为完全相反的方法——TG中现成的装饰程序范围甚至可以使具有简单主体的方法变得非常强大。我还发现将逻辑拆分为工作函数对于单元测试很有用。对不起,通过decoration,我指的不是decorators的@error\u handler'等,而是代理方法、包装方法,不管你想调用它们什么。我完全同意re:TG装饰师的说法,他们真的很强大,很有表现力。Re:单元测试-是的,这确实是一个很好的观点。