crossbar.io 中带有内联回调的扭曲和嵌套 Deferred

Twisted and nested Deferred with inline callbacks in crossbar.io

我对 Twisted 和 crossbar.io 比较陌生,目前我正在使用 sqlalchemy 和 alchimia(一个将 sqlalchemy 与 twisted 结合使用的层)进行一些数据库抽象。到目前为止,我构建的数据库抽象按预期工作,但在我的 crossbar 过程中进行异步数据库调用时遇到问题。我想那是因为我嵌套了异步调用,外部调用是一些交叉远程过程,内部调用是数据库访问。

我想做的是:

@inlineCallbacks
def onJoin(self, details):
  ...
  def login(user, password): # <-- outer call
    ...
    db_result = yield db.some_query(user, password) # <-- inner call
    for row in db_result: # <-- need to wait for db_result
      return 'authentication_ticket'
    return 'error'

为了能够对用户进行身份验证,我必须等待来自数据库的数据,然后发出有效票证或 return 错误。目前我收到一个错误,我无法迭代延迟,因为我不等待数据库查询完成。

现在,我如何在我的登录 RPC 中等待内部数据库调用,然后对用户进行身份验证,然后 return。我知道可以在扭曲中链接异步调用,但我不知道如何在这种特殊情况下使用 crossbar 以及当我的外部函数使用 @inlineCallbacks 快捷方式时。

更新:

修改我现在可以向数据库查询添加回调。不幸的是,现在我不知道如何将 return 值从内部函数传递到外部函数(外部函数需要 return 用户获得身份验证的票证):

@inlineCallbacks
  def onJoin(self, details):
  ...
  def login(user, password): # <-- outer call
    db_result = db.some_query(user, password) # <-- inner call

    def my_callback(query_result):
      if not query_result.is_empty():
        return 'user_ticket' # <-- needs to be returned by outer method

    db_result.addCallback(my_callback)

    return my_callback_result # <-- need something like that

我在我的回调函数中尝试了 defer.returnValue('user_ticket'),但这给了我一个错误。

你的问题似乎是,虽然 login 期望产生 Deferreds,但它没有用 @inlineCallbacks.

修饰