Python 延迟和返回结果

Python 延迟和返回结果,python,python-2.7,asynchronous,twisted,Python,Python 2.7,Asynchronous,Twisted,我试图创建“包装器”,它通过SQLAlchemy ORM与DB一起工作,但是返回结果时出现了一个问题:get error“Deferred instance没有属性'\uuuuuuuuu“getitem”' 我怎样才能解决这个问题 源代码: a) db_decorators.py from twisted.internet import threads from sqlalchemy import create_engine, pool from sqlalchemy.orm import se

我试图创建“包装器”,它通过SQLAlchemy ORM与DB一起工作,但是返回结果时出现了一个问题:get error“Deferred instance没有属性'\uuuuuuuuu“getitem”'

我怎样才能解决这个问题

源代码: a) db_decorators.py

from twisted.internet import threads
from sqlalchemy import create_engine, pool
from sqlalchemy.orm import sessionmaker


def toThread(func):
    def wrapper(*args, **kwargs):
        return threads.deferToThread(func, *args, **kwargs)
    return wrapper

class DBDefer(object):
    def __init__(self, dsn, poolclass=pool.SingletonThreadPool):
        self.engine = create_engine(dsn, poolclass=poolclass)

    def __call__(self, func):
        @toThread
        def wrapper(*args, **kwargs):
            session = sessionmaker(bind=self.engine)()
            try:
                return func(session=session, *args, **kwargs)
            except:
                session.rollback()
                raise
            finally:
                session.close()
         return wrapper    
b) 连接器.py

import sqlalchemy
from twisted.internet.defer import Deferred
from db_decorators import DBDefer
from tables import Users

dbdefer = DBDefer('postgresql://test:test@localhost/testdb')

@dbdefer
def find_user_by_login(user_login, session=None):
    return session.execute(sqlalchemy.select([Users]).where(Users.name == user_login)).fetchone()


class DB_API(object):

    def find_user_by_login(self, user_login):
        d = Deferred()
        def _gotResult(user):
            if user is None:
                d.errback('No such user')
            else:
                d.callback(dict(user))
            return user
        find_user_by_login(user_login).addCallbacks(_gotResult, d.errback)
        return d
c) server.py中的某个位置(Twisted上的服务器)

回溯:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
    return callWithContext({"system": lp}, func, *args, **kw)
  File "/usr/local/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "/usr/local/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/local/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
    return func(*args,**kw)
--- <exception caught here> ---
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
    why = selectable.doRead()
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 215, in doRead
    return self._dataReceived(data)
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 221, in _dataReceived
    rval = self.protocol.dataReceived(data)
  File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py", line 419, in dataReceived
    self._flushReceiveBIO()
  File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py", line 389, in _flushReceiveBIO
    ProtocolWrapper.dataReceived(self, bytes)
  File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/policies.py", line 120, in dataReceived
    self.wrappedProtocol.dataReceived(data)
  File "/usr/local/lib/python2.7/dist-packages/autobahn/twisted/websocket.py", line 78, in dataReceived
    self._dataReceived(data)
  File "/usr/local/lib/python2.7/dist-packages/autobahn/websocket/protocol.py", line 1270, in _dataReceived
    self.consumeData()
  File "/usr/local/lib/python2.7/dist-packages/autobahn/websocket/protocol.py", line 1286, in consumeData
    while self.processData() and self.state != WebSocketProtocol.STATE_CLOSED:
  File "/usr/local/lib/python2.7/dist-packages/autobahn/websocket/protocol.py", line 1445, in processData
    return self.processDataHybi()
  File "/usr/local/lib/python2.7/dist-packages/autobahn/websocket/protocol.py", line 1758, in processDataHybi
    fr = self.onFrameEnd()
  File "/usr/local/lib/python2.7/dist-packages/autobahn/websocket/protocol.py", line 1887, in onFrameEnd
    self._onMessageEnd()
  File "/usr/local/lib/python2.7/dist-packages/autobahn/twisted/websocket.py", line 107, in _onMessageEnd
    self.onMessageEnd()
  File "/usr/local/lib/python2.7/dist-packages/autobahn/websocket/protocol.py", line 734, in onMessageEnd
    self._onMessage(payload, self.message_is_binary)
  File "/usr/local/lib/python2.7/dist-packages/autobahn/twisted/websocket.py", line 110, in _onMessage
    self.onMessage(payload, isBinary)
  File "server.py", line 80, in onMessage
    json_data = self.commands_handlers['AUTH'](json_data)
  File "server.py", line 64, in authorization
    data, result_msg = commands.AUTH(result, data)
  File "/home/relrin/code/Helenae/helenae/commands.py", line 68, in AUTH
    if result['name'] == data['user']:
exceptions.AttributeError: Deferred instance has no attribute '__getitem__'
回溯(最近一次呼叫最后一次):
callWithLogger中的第88行文件“/usr/local/lib/python2.7/dist-packages/twisted/python/log.py”
返回callWithContext({“system”:lp},func,*args,**kw)
callWithContext中的文件“/usr/local/lib/python2.7/dist-packages/twisted/python/log.py”,第73行
返回context.call({ILogContext:newCtx},func,*args,**kw)
callWithContext中的文件“/usr/local/lib/python2.7/dist-packages/twisted/python/context.py”,第118行
返回self.currentContext().callWithContext(ctx,func,*args,**kw)
callWithContext中的文件“/usr/local/lib/python2.7/dist-packages/twisted/python/context.py”,第81行
返回函数(*参数,**kw)
---  ---
文件“/usr/local/lib/python2.7/dist-packages/twisted/internet/posixbase.py”,第614行,在_-doReadOrWrite中
why=selectable.doRead()
文件“/usr/local/lib/python2.7/dist-packages/twisted/internet/tcp.py”,第215行,在doRead中
返回自我。已接收数据(数据)
文件“/usr/local/lib/python2.7/dist-packages/twisted/internet/tcp.py”,第221行,已收到数据
rval=self.protocol.dataReceived(数据)
dataReceived中的文件“/usr/local/lib/python2.7/dist packages/twisted/protocols/tls.py”,第419行
self._flushReceiveBIO()
文件“/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py”,第389行,in_-flusherceivebio
ProtocolWrapper.dataReceived(自身,字节)
文件“/usr/local/lib/python2.7/dist-packages/twisted/protocols/policies.py”,第120行,在dataReceived中
self.wrappedProtocol.dataReceived(数据)
文件“/usr/local/lib/python2.7/dist-packages/autobahn/twisted/websocket.py”,第78行,已收到数据
自接收数据(数据)
文件“/usr/local/lib/python2.7/dist packages/autobahn/websocket/protocol.py”,第1270行,在_dataReceived中
self.consumerdata()
ConsumerData中的文件“/usr/local/lib/python2.7/dist packages/autobahn/websocket/protocol.py”,第1286行
而self.processData()和self.state!=WebSocketProtocol.STATE_已关闭:
processData中的文件“/usr/local/lib/python2.7/dist packages/autobahn/websocket/protocol.py”,第1445行
返回self.processDataHybi()
文件“/usr/local/lib/python2.7/dist packages/autobahn/websocket/protocol.py”,第1758行,在processDataHybi中
fr=self.onFrameEnd()
onFrameEnd中的文件“/usr/local/lib/python2.7/dist packages/autobahn/websocket/protocol.py”,第1887行
self.\u onMessageEnd()
文件“/usr/local/lib/python2.7/dist packages/autobahn/twisted/websocket.py”,第107行,在_onmessagend中
self.onMessageEnd()
onMessageEnd中的文件“/usr/local/lib/python2.7/dist packages/autobahn/websocket/protocol.py”,第734行
self.\u onMessage(有效负载,self.message是二进制的)
文件“/usr/local/lib/python2.7/dist packages/autobahn/twisted/websocket.py”,第110行,在消息中
onMessage(有效负载,isBinary)
onMessage中第80行的文件“server.py”
json_data=self.commands_处理程序['AUTH'](json_数据)
授权中第64行的文件“server.py”
数据,结果\u msg=commands.AUTH(结果,数据)
文件“/home/relrin/code/Helenae/Helenae/commands.py”,第68行,在AUTH中
如果结果['name']==数据['user']:
exceptions.AttributeError:延迟实例没有属性“\uuu getitem\uuu”

self.db\u api.find\u user\u by\u login(data['user'])
返回一个
延迟的

使用它的代码-
data,result\u msg=commands.AUTH(result,data)
-忽略此事实,而是将其视为一个结果

问题中一半的代码正确地使用了
延迟
。例如,这是正确的:

find_user_by_login(user_login).addCallbacks(_gotResult, d.errback)
但是发生错误的代码并不试图定义或设置任何回调。它试图使用一个
延迟的
,就好像它是一个结果一样——但事实并非如此

您需要更多地使用
addCallback


也可以考虑查看是否使用SqLalCyy并拧在一起。<> >代码> SUB.dBAPI。 使用它的代码-

data,result\u msg=commands.AUTH(result,data)
-忽略此事实,而是将其视为一个结果

问题中一半的代码正确地使用了
延迟
。例如,这是正确的:

find_user_by_login(user_login).addCallbacks(_gotResult, d.errback)
但是发生错误的代码并不试图定义或设置任何回调。它试图使用一个
延迟的
,就好像它是一个结果一样——但事实并非如此

您需要更多地使用
addCallback


也可以考虑查看是否使用SqLalCyy并拧在一起。<> >代码> SUB.dBAPI。 使用它的代码-

data,result\u msg=commands.AUTH(result,data)
-忽略此事实,而是将其视为一个结果

问题中一半的代码正确地使用了
延迟
。例如,这是正确的:

find_user_by_login(user_login).addCallbacks(_gotResult, d.errback)
但是发生错误的代码并不试图定义或设置任何回调。它试图使用一个
延迟的
,就好像它是一个结果一样——但事实并非如此

您需要更多地使用
addCallback


也可以考虑查看是否使用SqLalCyy并拧在一起。<> >代码> SUB.dBAPI。 使用它的代码-

data,result\u msg=commands.AUTH(result,data)
-忽略此事实,而是将其视为一个结果

问题中一半的代码正确地使用了
延迟
。例如,这是正确的:

find_user_by_login(user_login).addCallbacks(_gotResult, d.errback)
但是密码是什么