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

Python异步编程疑问:aiohttp代码await位置及资料推荐

解答你的aiohttp异步编程疑问

1. 代码中await的正确使用位置

首先要明确:aiohttp的resp.cookies是同步属性,不需要用await调用——这就是你触发TypeError的原因!只有异步IO方法(比如resp.text()、resp.json()、resp.read()这些)才需要加await。

修正后的代码如下,我标注了关键注意点:

import asyncio
import aiohttp

def getting_credentials(file_path):
    # 假设这是你的获取payload的同步函数
    return {"username": "your_user", "password": "your_pwd"}

async def fetch_cookies():
    async with aiohttp.ClientSession() as session:
        payload = getting_credentials('config.txt')
        async with session.post('https://some.website', data=payload) as resp:
            # resp.status是整数类型,这里修正判断逻辑
            assert resp.status == 200, f"请求失败,状态码:{resp.status}"
            print(resp.headers)  # headers是同步属性,直接访问即可
            
            # resp.cookies是同步属性,无需await,直接赋值
            cookies = resp.cookies
            jsessionid = None
            token = None
            for v in cookies.values():
                if len(v.value) == 32 :
                    jsessionid = v.value
                elif len(v.value) == 36:
                    token = v.value
            
            # 如果需要读取响应文本,这里必须加await
            # print(await resp.text())
            
            # 提前校验避免后续报错
            assert jsessionid and token, "未找到目标Cookie值"
            return {'JSESSIONID': jsessionid, 'Token': token}

async def main():
    result = await fetch_cookies()
    print(result)

asyncio.run(main())

核心规则:

  • resp.status、resp.headers、resp.cookies都是同步属性,直接访问就行
  • 只有调用涉及IO操作的异步方法(比如读取响应体、发送后续请求)时,才需要加await

2. Python异步编程入门资料推荐

不用找外部链接,专注官方和核心概念学习就足够扎实:

  • Python官方asyncio教程:最权威的入门资料,从async/await基础语法,到事件循环、任务调度、并发模式,覆盖所有核心知识点
  • aiohttp官方文档:针对aiohttp库的专属指南,包含大量实战示例,能帮你快速掌握异步HTTP请求的写法
  • 优先啃核心概念:先搞懂协程对象、可等待对象(Awaitable)、事件循环的作用,这些是异步编程的底层逻辑

3. func1是否会在fetch_cookies完成前执行?

答案是:完全取决于你如何调用它们。

如果func1依赖fetch_cookies返回的Cookie,必须确保fetch_cookies执行完成后再启动func1,正确做法是:

  1. 把func1定义为异步函数
  2. 在同一个异步上下文(比如main函数)中,先await fetch_cookies()拿到结果,再将结果传入func1并await它

示例代码:

async def func1(cookies):
    async with aiohttp.ClientSession(cookies=cookies) as session:
        async with session.post('https://target.website', data={"data": "test"}) as resp:
            assert resp.status == 200
            print("func1请求成功")
            return await resp.text()

async def main():
    # 等待fetch_cookies完成,拿到有效Cookie
    cookies = await fetch_cookies()
    # 再启动func1,此时Cookie已准备就绪
    func1_result = await func1(cookies)
    print(func1_result)

asyncio.run(main())

如果不使用await,直接写cookies = fetch_cookies()然后调用func1(cookies),会出现两个问题:

  • cookies只是一个协程对象,不是真实的Cookie字典
  • func1会被提前调度执行,此时fetch_cookies还没完成,必然导致错误

内容的提问来源于stack exchange,提问作者Herminne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:23:15