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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:30:47