You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:30:02