【发布时间】:2020-06-17 17:31:06
【问题描述】:
当我尝试使用 Python 3.7.7、Twisted 20.3.0(和 Scrapy 2.1.0)时...
doc_link = await self.upload_reseller_document(doc_request, self.create_id(contract))
我得到一个延迟而不是一个字符串。我的回调也没有等待。
预期:https://s3.amazonaws.com/some-bucket/some_file.csv 或 None
收到:<Deferred at 0x11ae61dd0 current result: None>
async def conditional_upload(request):
docs_bucket = 'some-bucket'
key = f'some-prefix/some_file.csv'
url = f'https://s3.amazonaws.com/{docs_bucket}/{key}'
async def cb(obj):
print('found key, returning url')
return defer.success(url)
async def upload_doc():
print('called upload_doc')
response = await self.crawler.engine.download(request, self)
if response.status != 200:
# Error happened, return item.
print('could not download reseller csv')
return defer.error(None)
print('uploading to', docs_bucket, key)
return threads.deferToThread(
self.s3client.put_object,
Bucket=docs_bucket,
Key=key,
Body=response.body)
async def eb(failure):
print('did not find key')
if failure.type != ClientError:
raise failure.value
return upload_doc()
return ensureDeferred(threads.deferToThread(
self.s3client.head_object,
Bucket=docs_bucket,
Key=key).addCallbacks(cb, eb))
【问题讨论】:
-
您正在返回一个名为
ensureDeferred的函数的结果,该函数的工作是将其参数转换为 Deferred。这就是为什么你要从函数中得到一个 Deferred 的原因。试试return await ensureDeferred(...)。 -
另外,如果您有
await供您使用,您可能不需要首先通过addCallbacks,您可以等待deferToThread 的结果。
标签: scrapy python-asyncio twisted