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

如何在视图中调用API并渲染数据?排查无输出问题

问题排查与修复方案

核心问题分析

  • 视图函数打印语句无效:views.py中print(fixtures)写在return语句之后,代码执行到return就会终止,永远无法触发打印。
  • 数据函数无返回值:fixtures.py的get_fixtures()函数未添加return fixtures,导致视图拿到的fixtures是None,模板无数据可渲染。
  • 缺少异常捕获机制:API调用过程中可能出现认证失败、网络错误、日历ID无效等问题,但没有错误捕获,无法定位故障根源。

修改后的代码

fixtures.py

def get_fixtures():
    credentials = service_account.Credentials.from_service_account_file(
        settings.GOOGLE_CALENDAR_CREDENTIALS_FILE,
        scopes=['https://www.googleapis.com/auth/calendar.readonly']
    )
    service = build('calendar', 'v3', credentials=credentials)

    try:
        events = service.events().list(calendarId='u6kmbrsrt5qr3r6gjrtsussomc@group.calendar.google.com').execute()
    except Exception as e:
        print(f"API调用异常: {str(e)}")
        return []
    
    fixtures = []
    # 用get('items', [])避免items不存在时抛出KeyError
    for event in events.get('items', []):
        fixture = {
            'summary': event.get('summary', '无标题'),
            'start': event['start'].get('dateTime', event['start'].get('date')),
            'end': event['end'].get('dateTime', event['end'].get('date')),
        }
        fixtures.append(fixture)
    
    return fixtures  # 添加返回语句,将数据传递给视图

views.py

def fixtures_view(request):
    fixtures = get_fixtures()
    print(fixtures)  # 移至return前,确保代码执行
    return render(request, 'fixtures.html', {'fixtures': fixtures})

额外检查项

  • 确认模板fixtures.html正确遍历数据:
    {% for fixture in fixtures %}
        <div class="fixture-item">
            <h3>{{ fixture.summary }}</h3>
            <p>开始时间:{{ fixture.start }}</p>
            <p>结束时间:{{ fixture.end }}</p>
        </div>
    {% empty %}
        <p>暂无赛事数据</p>
    {% endfor %}
    
  • 验证GOOGLE_CALENDAR_CREDENTIALS_FILE路径正确,且服务账号已被授权访问目标日历(需在Google Calendar设置中共享日历给该服务账号邮箱)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:02:32