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

如何在Django中调用多个API并在模板中渲染所有API响应

解决单个模板渲染多个API响应的问题

先搞定GET 405错误的根源

你之前把两个API调用函数放进类中出现405,核心问题是类视图没正确处理GET请求:

  • 如果用了Django REST Framework的APIView但没重写get()方法,默认它只允许OPTIONS、HEAD请求,GET请求会直接被拒绝
  • 要是继承了只支持POST的视图基类,同样会导致GET请求不被允许

可行的解决方案

方案1:用TemplateView类视图整合两个API请求

这是最适合渲染模板的方式,重写get_context_data方法,在里面同时调用两个API,把数据打包传给模板:

from django.views.generic import TemplateView
import requests

class MultiAPITemplateView(TemplateView):
    template_name = '你的模板文件名.html'  # 替换成实际模板路径

    def get_context_data(self, **kwargs):
        # 获取父类的基础上下文
        context = super().get_context_data(**kwargs)
        
        # 调用第一个API并处理结果
        try:
            api1_res = requests.get('第一个API的完整URL')
            api1_res.raise_for_status()  # 触发HTTP错误异常
            context['api1_data'] = api1_res.json()
        except requests.exceptions.RequestException as e:
            context['api1_error'] = f'API1请求失败:{str(e)}'
        
        # 调用第二个API并处理结果
        try:
            api2_res = requests.get('第二个API的完整URL')
            api2_res.raise_for_status()
            context['api2_data'] = api2_res.json()
        except requests.exceptions.RequestException as e:
            context['api2_error'] = f'API2请求失败:{str(e)}'
        
        return context

在urls.py中配置路径:

from django.urls import path
from .views import MultiAPITemplateView

urlpatterns = [
    path('multi-api-view/', MultiAPITemplateView.as_view(), name='multi-api-view'),
]

模板里直接用{{ api1_data }}、{{ api2_data }}渲染数据,还能通过{{ api1_error }}处理异常情况。

方案2:用普通函数视图实现

如果觉得类视图麻烦,直接写函数视图也能快速解决:

from django.shortcuts import render
import requests

def multi_api_view(request):
    context = {}
    if request.method == 'GET':
        # 调用第一个API
        try:
            api1_res = requests.get('第一个API的完整URL')
            api1_res.raise_for_status()
            context['api1_data'] = api1_res.json()
        except requests.exceptions.RequestException as e:
            context['api1_error'] = f'API1请求失败:{str(e)}'
        
        # 调用第二个API
        try:
            api2_res = requests.get('第二个API的完整URL')
            api2_res.raise_for_status()
            context['api2_data'] = api2_res.json()
        except requests.exceptions.RequestException as e:
            context['api2_error'] = f'API2请求失败:{str(e)}'
    
    return render(request, '你的模板文件名.html', context)

urls配置:

path('multi-api-view/', multi_api_view, name='multi-api-view'),

额外注意事项

  • 建议把API调用逻辑封装成单独的工具函数,不要直接写在视图里,方便后续维护和复用
  • 生产环境给requests请求加超时时间,比如requests.get(url, timeout=10),避免请求卡住拖垮页面
  • 如果API需要认证,记得在请求头里带上参数,比如headers={'Authorization': 'Bearer 你的token'}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:15:32