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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:19:26