如何在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
相关产品推荐
相关产品推荐

