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,正确做法是:
- 把func1定义为异步函数
- 在同一个异步上下文(比如
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
相关产品推荐
相关产品推荐

