如何在视图中调用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
相关产品推荐
相关产品推荐

