8

我是 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 装饰器?

4

2 回答 2

11

方法render_GET可能不会返回Deferred. 它可能只返回一个字符串或NOT_DONE_YET. 任何用 装饰的方法inlineCallbacks都将返回一个Deferred. 所以,你不能render_GETinlineCallbacks.

当然,没有什么能阻止你调用你想要 in 的任何其他函数render_GET,包括返回 a 的函数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 进行任何严肃的 Web 开发,我建议至少看看txyogaklein 。即使您不想使用它们,它们也应该为您提供一些关于如何构建代码并完成各种常见任务的好主意。

于 2013-02-06T17:05:22.950 回答
-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)
于 2013-02-05T17:15:29.817 回答