使用inlineCallbacks

时间:2013-02-05 16:56:03

标签: python twisted deferred

我是Twisted的新手,我正在尝试编写一个简单的资源 显示数据库中的名称列表,这是我的代码的一部分:

#code from my ContactResource class
def render_GET(self, request):
    def print_contacts(contacts, request):
        for c in contacts:
            request.write(c.name)
        if not request.finished:
            request.finish()
    d = Contact.find() #Contact is a Twistar DBObject subclass
    d.addCallback(print_contacts, request)
    return NOT_DONE_YET

我的问题是:如何更改此方法以使用inlineCallbacks装饰器?

2 个答案:

答案 0 :(得分:11)

render_GET方法可能不会返回Deferred。它可能只返回一个字符串或NOT_DONE_YET。使用inlineCallbacks修饰的任何方法都将返回Deferred。因此,您不能使用render_GET装饰inlineCallbacks

当然,没有什么可以阻止你在render_GET中调用你想要的任何其他功能,包括一个返回Deferred的功能。只需抛弃Deferred而不是从render_GET返回它(当然,确保Deferred永远不会因失败而触发,或者扔掉它可能会丢失一些错误报告...)。

所以,例如:

@inlineCallbacks
def _renderContacts(self, request):
    contacts = yield Contact.find() 
    for c in contacts:
        request.write(c.name)
    if not request.finished:
        request.finish()


def render_GET(self, request):
    self._renderContacts(request)
    return NOT_DONE_YET

如果您打算使用Twisted进行任何严肃的网络开发,我建议至少查看txyogaklein。即使您不想使用它们,它们也应该为您提供一些关于如何构建代码并完成各种常见任务的好主意。

答案 1 :(得分:-2)

编辑:我没有找到如何将twisted.web与inlineCallbacks组合的示例,但这里有两个建议。第一个是可取的,但我不确定它是否有效。

@inlineCallbacks
def render_GET(self, request):
    contacts = yield Contact.find() 
    defer.returnValue(''.join(c.name for c in contacts)


@inlineCallbacks
def render_GET(self, request):
    contacts = yield Contact.find() 
    for c in contacts:
        request.write(c.name)
    if not request.finished:
        request.finish()
    defer.returnValue(NOT_DONE_YET)