如何在Django中调用多个REST API?能否用requests.get()请求多接口数据
嘿,刚好我之前也踩过类似的坑,直接给你说结论吧——你写的那种方式不行哦!
requests.get()方法的第一个参数是目标URL,但从第二个参数开始,都是params、headers这类请求配置参数,根本不是用来传第二个URL的。如果你直接塞多个URL进去,会立刻抛出TypeError,提示参数数量不匹配。
下面给你两种可行的解决方案,按需选择:
方案1:同步逐个请求(简单直接,适合少量接口)
如果接口数量不多,同步循环请求是最容易实现和维护的,代码逻辑也清晰:
import requests # 把要请求的接口URL整理成列表 api_urls = [ 'http://freegeoip.net/json/', 'http://api.example.com', 'http://api.anotherexample.com' ] responses = [] for url in api_urls: try: # 逐个发送GET请求 resp = requests.get(url) # 主动触发HTTP错误(比如404、500这类状态码),避免默默吞掉异常 resp.raise_for_status() responses.append(resp) except requests.exceptions.RequestException as e: # 捕获请求异常,保证一个接口失败不会中断整个循环 print(f"请求 {url} 失败: {str(e)}") # 处理每个接口的返回数据 for idx, resp in enumerate(responses): if resp: print(f"第{idx+1}个接口返回内容: {resp.json()}")
方案2:异步并发请求(高效快速,适合多接口场景)
如果要请求的接口数量较多,同步请求会很慢(因为要等前一个请求完成才会发下一个),这时候用异步并发能大幅节省时间。requests本身是同步库,我们可以用aiohttp这个异步HTTP库来实现:
import aiohttp import asyncio # 定义单个接口的异步请求函数 async def fetch_single(session, url): try: async with session.get(url) as response: # 根据接口返回格式选择json()或text() return await response.json() except aiohttp.ClientError as e: print(f"请求 {url} 出错: {str(e)}") return None # 主异步函数,负责批量发起请求 async def fetch_all(): api_urls = [ 'http://freegeoip.net/json/', 'http://api.example.com', 'http://api.anotherexample.com' ] # 创建异步会话(类似requests的Session,复用连接提升效率) async with aiohttp.ClientSession() as session: # 生成所有请求任务 tasks = [fetch_single(session, url) for url in api_urls] # 并发执行所有任务,等待全部完成后返回结果列表 results = await asyncio.gather(*tasks) return results # 在Django中使用的注意点: # 1. 若用在视图中,Django 3.0+支持异步视图,直接把视图定义为async def即可 # 2. 若用在后台任务,可结合异步任务框架或直接用asyncio.run()触发 if __name__ == "__main__": all_results = asyncio.run(fetch_all()) print("所有接口返回结果:", all_results)
额外提醒
在Django环境中使用异步请求时,要确保你的Django版本支持异步特性(3.0及以上),如果是旧版本,也可以用threading多线程来实现并发请求,原理和异步类似,只是底层实现不同。
内容的提问来源于stack exchange,提问作者Rakibul bashar
相关产品推荐
相关产品推荐

