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
期望产生 Deferred
s,但它没有用 @inlineCallbacks
.
修饰
我对 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
期望产生 Deferred
s,但它没有用 @inlineCallbacks
.