首页 > 解决方案 > 用于 DynamoDB 查询的 Python 代码适用于 v3.6,但不适用于 python 2.7

问题描述

我有一个带有 boto3 框架的 DynamoDB 查询,它适用于运行 Python 3.6 的本地机器,但不适用于运行 Python 2.7 的服务器。

我本地机器上的工作代码:

dyndb = boto3.resource('dynamodb')
table = dyndb.Table('XXXXXXX')

response = table.query(
      IndexName = "XXX-XXX-index",
      ProjectionExpression = "AssessID,SNo,Details,Status,OTP",
      KeyConditionExpression = Key('OTP').eq(otp))

服务器上运行的代码...

    global user_otp

         dyndb = boto3.resource('dynamodb')
         table = dyndb.Table('XXXXXX')

         otp = int(user_otp)

         print("converting string otp to int otp") # it is printed on console
         response = table.query(
                 IndexName = "XXX-XXX-index",
                 ProjectionExpression = "AssessID,SNo,Details,Status,OTP",
                 KeyConditionExpression = Key('OTP').eq(otp) & Key('SNo').between(1,5))

         print ("response code is executing file") # it is not printed on console

当我打印输出时,会显示第一次打印,但不会在表查询之后显示第二次打印。

我正在使用OTP分区键和SNo排序键对全局索引进行此查询。我在本地机器上只使用分区键得到结果,但在我的服务器上却没有,即使同时使用分区键和排序键也是如此。

DynamoDB 不会引发任何异常。相反,我得到了龙卷风 websocket 异常。

control coming to process and response function
user otp mentioned is  3086and its type <type 'int'>
converting string otp to int otp

ERROR:tornado.application:Exception in callback <functools.partial object at 0x7f33b6ce7890>
Traceback (most recent call last):
  File "/usr/lib64/python2.7/site-packages/tornado/ioloop.py", line 758, in _run_callback
    ret = callback()
  File "/usr/lib64/python2.7/site-packages/tornado/stack_context.py", line 300, in null_wrapper
    return fn(*args, **kwargs)
  File "/usr/lib64/python2.7/site-packages/tornado/ioloop.py", line 779, in _discard_future_result
    future.result()
  File "/usr/lib64/python2.7/site-packages/tornado/concurrent.py", line 261, in result
    raise_exc_info(self._exc_info)
  File "/usr/lib64/python2.7/site-packages/tornado/gen.py", line 1141, in run
    yielded = self.gen.throw(*exc_info)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 888, in _receive_frame_loop
    yield self._receive_frame()
  File "/usr/lib64/python2.7/site-packages/tornado/gen.py", line 1133, in run
    value = future.result()
  File "/usr/lib64/python2.7/site-packages/tornado/concurrent.py", line 261, in result
    raise_exc_info(self._exc_info)
  File "/usr/lib64/python2.7/site-packages/tornado/gen.py", line 1147, in run
    yielded = self.gen.send(value)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 975, in _receive_frame
    handled_future = self._handle_message(opcode, data)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 1000, in _handle_message
    return self._run_callback(self.handler.on_message, decoded)
  File "/usr/lib64/python2.7/site-packages/tornado/websocket.py", line 548, in _run_callback
    self.handler.log_exception(*sys.exc_info())
AttributeError: 'WebSocketClientConnection' object has no attribute 'log_exception'

标签: python-3.xpython-2.7websocketamazon-dynamodbtornado

解决方案


我认为“无属性 log_exception”是 Tornado 5 中的一个错误,已在 Tornado 6 中修复。但是,Tornado 6 只支持 Python 3,所以在 Python 2 中你会得到旧版本。

这里还有另一个错误,但你看不到它是什么,因为 Python 2 的错误处理不如 Python 3 好。并且该错误显然不会在 Python 3 上发生。如果您必须继续支持 Python 2,请尝试try/except在回调的主体周围添加一个块on_message(或使用read_message接口而不是on_message回调)。


推荐阅读