在Django中无法从Codeforces API获取竞赛信息的问题求助
解决Codeforces API竞赛数据展示问题
1. 修正Requests库的使用
不要依赖pip._vendor.requests(这是pip内部的私有依赖),直接安装官方requests库:
pip install requests
之后在views.py里正常导入:
import requests
2. 正确处理API响应数据
Codeforces的contest.list API返回结构固定为:
{ "status": "OK", "result": [ {"id": 123, "name": "竞赛名称", "startTimeSeconds": 1699999999, ...}, ... ] }
你的原代码直接把整个响应字典传给模板,但实际竞赛数据存在result字段里。同时要处理API请求失败、返回错误的情况,还要完成时间转换和URL构造。
修改后的views.py:
from django.shortcuts import render from datetime import datetime import requests def homepage(request): # 站点基础信息(后续扩展多站点时,可通过配置/参数动态获取) site_info = { "name": "Codeforces", "base_url": "https://codeforces.com" } api_url = "https://codeforces.com/api/contest.list" contests = [] try: response = requests.get(api_url).json() if response.get("status") == "OK": contests = response["result"] # 批量处理每个竞赛的时间和URL for contest in contests: # 把UNIX时间戳转成可读格式 timestamp = contest.get("startTimeSeconds", 0) contest["formatted_time"] = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S") # 构造竞赛详情页URL contest["detail_url"] = f"{site_info['base_url']}/contest/{contest['id']}" except Exception: # 捕获请求失败、解析错误等异常,避免页面崩溃 pass # 整理要传给模板的数据 context = { "site_name": site_info["name"], "contest_list": contests } return render(request, 'home.html', context)
3. 修正模板遍历逻辑
模板里需要遍历的是处理后的contest_list数组,而不是原API响应字典。修改home.html:
<div class="box"> <h3>{{ site_name }} 竞赛列表</h3> {% for contest in contest_list %} <div class="contest-card"> <p><strong>竞赛名称:</strong>{{ contest.name }}</p> <p><strong>开始时间:</strong>{{ contest.formatted_time }}</p> <a href="{{ contest.detail_url }}" target="_blank">查看竞赛详情</a> </div> {% empty %} <p>暂无竞赛数据或加载失败</p> {% endfor %} </div>
4. 多站点扩展思路
如果后续要支持多个竞赛平台(如AtCoder、CodeChef),可以:
- 在
settings.py里配置各站点的API地址、URL模板等信息:# settings.py CONFIG_SITES = { "codeforces": { "name": "Codeforces", "api_url": "https://codeforces.com/api/contest.list", "url_template": "https://codeforces.com/contest/{id}" }, "atcoder": { "name": "AtCoder", "api_url": "https://atcoder.jp/api/contests", "url_template": "https://atcoder.jp/contests/{id}" } } - 视图通过URL参数(如
?site=codeforces)动态选择站点配置,统一处理数据格式。
内容的提问来源于stack exchange,提问作者Nafis Sadique Ayan
相关产品推荐
相关产品推荐

