使用types_aiobotocore_sqs创建SQS客户端时遇'NoneType'无request属性错误
问题:使用types_aiobotocore_sqs和aiobotocore创建SQS客户端时出现'NoneType'无'request'属性错误
刚接触Python3异步编程,使用types_aiobotocore_sqs和aiobotocore库创建AWS SQS客户端时,触发如下报错:
ERROR: botocore.exceptions.HTTPClientError: An HTTP Client raised an unhandled exception: 'NoneType' object has no attribute 'request'
错误发生在Sqs类的response = await self.client.get_queue_url(QueueName=self.queue_name)代码行。
代码实现
url.py 文件
@api_view(["GET"]) def root_view(request): async def run_async(): sqs_helper = await Helper.create(QueueName.TEST_QUEUE.value) message = await sqs_helper.get_queue_url() return message response = asyncio.run(run_async()) return Response(str(response))
sqs_helper 文件
class Helper: def __init__(self, queue_name: str) -> None: self.queue_name = queue_name self.access_key_id = env("AWS_ACCESS_KEY_ID") self.secret_access_key = env("AWS_SECRET_ACCESS_KEY") self.region_name = env("REGION_NAME") self.sqs = None @classmethod async def create(cls, queue_name): instance = cls(queue_name) await instance.setup() return instance async def setup(self): self.sqs_client = await self.create_sqs_client() self.sqs = Sqs(self.sqs_client, self.queue_name) async def create_sqs_client(self): session = get_session() async with session.create_client('sqs', region_name=self.region_name, aws_access_key_id=self.access_key_id, aws_secret_access_key=self.secret_access_key) as client: client: SQSClient print("TYPE" + str(client)) return client async def get_queue_url(self): return await self.sqs.get_queue_url()
SQS客户端初始化类
class Sqs: def __init__(self, client: SQSClient, queue_name: str) -> None: self.queue_name = queue_name self._queue_url = "" self.client = client async def get_queue_url(self) -> str: if not self._queue_url: try: response = await self.client.get_queue_url(QueueName=self.queue_name) self._queue_url = response["QueueUrl"] except ClientError as err: if ( err.response.get("Error", {}).get("Code") == "AWS.SimpleQueueService.NonExistentQueue" ): raise QueueDoesNotExist( f"Queue {self.queue_name} does not exist" ) from err raise err return self._queue_url
问题原因与修复方案
原因分析
在Helper.create_sqs_client方法中,你使用了async with上下文管理器创建SQS客户端。当async with的缩进块执行完毕后,客户端会被自动关闭并销毁,此时返回的client变量已经变成None。后续调用self.client.get_queue_url()时,自然会触发'NoneType' object has no attribute 'request'的错误。
修复代码
1. 修改create_sqs_client方法
去掉async with,直接创建并返回客户端实例:
async def create_sqs_client(self): session = get_session() client = await session.create_client( 'sqs', region_name=self.region_name, aws_access_key_id=self.access_key_id, aws_secret_access_key=self.secret_access_key ) client: SQSClient print("TYPE" + str(client)) return client
2. 添加资源清理方法(可选但推荐)
为避免客户端资源泄漏,在Helper类中添加关闭客户端的方法:
async def close(self): if hasattr(self, 'sqs_client') and self.sqs_client: await self.sqs_client.close()
3. 在调用处确保关闭客户端
修改url.py中的代码,使用try-finally保证客户端被正确关闭:
@api_view(["GET"]) def root_view(request): async def run_async(): sqs_helper = await Helper.create(QueueName.TEST_QUEUE.value) try: message = await sqs_helper.get_queue_url() return message finally: await sqs_helper.close() response = asyncio.run(run_async()) return Response(str(response))
内容的提问来源于stack exchange,提问作者WKWW
相关产品推荐
相关产品推荐

