我对Twisted和crossbar.io相对较新,我目前正在使用sqlalchemy和alchimia(一个使用sqlalchemy with twisted的层)进行一些数据库抽象。到目前为止我构建的db抽象正在按预期工作,但在我的crossbar过程中进行异步db调用时遇到问题。我想这是因为我有嵌套的异步调用,外部调用是一些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'
为了能够对用户进行身份验证,我必须等待数据库中的数据,然后发出有效的票证或返回错误。目前我收到一个错误,我无法迭代延迟,因为我不等待db查询完成。
现在,我如何在我的登录RPC内等待内部数据库调用,然后验证用户然后返回。我知道可以将扭曲的异步调用链接起来,但我不知道在这个特殊情况下如何使用crossbar以及当我的外部函数使用@inlineCallbacks
快捷方式时这样做。
更新
修补我现在可以添加回调数据库查询。不幸的是现在我不知道如何将内部函数的返回值传递给外部函数(外部函数需要返回用户通过身份验证的票证):
@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')
,但这给了我一个错误。
答案 0 :(得分:2)
您的问题似乎是,虽然login
预计会产生Deferred
,但它并未使用@inlineCallbacks
进行修饰。