使用alchimia库获取查询结果

2024-03-28 22:48:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用alchimia为DB获取异步API。尝试向DB发出一个简单的请求,如:

    def authorization(self, data):
        """
            Checking user with DB
        """

        def __gotResult(user):
            yield engine.execute(sqlalchemy.select([Users]).where(Users.name == user))

        result = __gotResult(data['user'])
        log.msg("[AUTH] User=%s trying to auth..." % data['user'])
        data, result_msg = commands.AUTH(result, data)
        log.msg(result_msg)
        return data

无法理解-我做错了什么?引擎选项中可能有问题(其中reactor=[])?在

源代码:

^{pr2}$

回溯:

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 84, in onMessage
    json_data = self.commands_handlers['AUTH'](json_data)
  File "server.py", line 68, 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.TypeError: 'generator' object has no attribute '__getitem__'

Tags: inpyselfdatalibpackagesusrlocal
1条回答
网友
1楼 · 发布于 2024-03-28 22:48:29

我认为您在__gotResult()周围缺少一个@inlineCallbacks,这可能对您帮助不大;因为用内联回调包装的单个语句生成器有点毫无意义。无论如何,您应该习惯于使用显式延迟处理。让我们把这个分开:

def authorization(self, data):
    """
        Checking user with DB
    """
    # engine.execute already gives us a deferred, will grab on to that.
    user = data['user']
    result_d = engine.execute(sqlalchemy.select([Users]).where(Users.name == user))

    # we don't have the result in authorization, 
    # we need to wrap any code that works with its result int a callback.
    def result_cb(result):
        data, result_msg = commands.AUTH(result, data)
        return data

    result_d.addCallback(result_cb)

    # we want to pass the (asynchronous) result out, it's hiding in our deferred;
    # so we return *that* instead; callers need to add more callbacks to it.
    return result_d

如果您坚持,我们可以将其压缩成内联回调表单:

^{pr2}$

但是,和前面一样,authorization()是异步的;并且必须是异步的,因为{}是异步的。要使用它,您必须将一个回调附加到它返回的延迟时间(尽管如果它也被包装在inlineCallbacks中,调用者也可以生成

相关问题 更多 >