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

Python3.6中调用GitHub API获取指定关键词仓库列表的问题

解决GitHub API调用无法获取仓库列表的问题

你已经成功发起请求并拿到了200状态码(说明请求本身是成功的),但核心问题是你没有解析API返回的JSON数据,而是直接把requests.Response对象传给了模板——这个对象本身只会显示状态码之类的元信息,不会包含实际的仓库数据。下面一步步帮你修复:

1. 解析API响应并正确传递数据

首先要调用response.json()把GitHub返回的JSON格式内容转换成Python字典,同时优化URL拼接方式(避免编码问题),还要处理异常情况:

修改你的views.py代码:

import requests
from django.views.generic import CreateView
from django.shortcuts import render

class GhNavigator(CreateView):
    def get(self, request, *args, **kwargs):
        term = request.GET.get('search_term')
        # 处理用户未输入关键词的情况
        if not term:
            return render(request, 'navigator/template.html', {'repositories': []})
        
        username = 'arycloud'
        token = 'API_TOKEN'
        
        # 用params参数传递搜索词,自动处理URL编码
        params = {'q': term}
        response = requests.get(
            'https://api.github.com/search/repositories',
            params=params,
            auth=(username, token)
        )
        
        # 处理非200的异常响应
        if response.status_code != 200:
            error_msg = f"请求失败:状态码 {response.status_code}"
            # 可以根据具体状态码细化提示,比如401是认证失败,403是API限流
            return render(request, 'navigator/template.html', {'error': error_msg, 'repositories': []})
        
        # 解析JSON数据,GitHub搜索结果的仓库列表在items字段里
        api_data = response.json()
        repositories = api_data.get('items', [])
        
        print(f"找到 {len(repositories)} 个匹配仓库")
        return render(request, 'navigator/template.html', {'repositories': repositories})

2. 在模板中展示仓库列表

接下来在navigator/template.html里,遍历repositories变量来渲染内容:

{% if error %}
    <p style="color: red;">{{ error }}</p>
{% endif %}

{% if repositories %}
    <h3>搜索结果(共{{ repositories|length }}个):</h3>
    <ul>
        {% for repo in repositories %}
            <li>
                <a href="{{ repo.html_url }}" target="_blank">{{ repo.name }}</a>
                <p>{{ repo.description|default:"无描述信息" }}</p>
                <small>星标数: {{ repo.stargazers_count }} | 语言: {{ repo.language|default:"未知" }}</small>
            </li>
        {% endfor %}
    </ul>
{% else %}
    {% if search_term %}
        <p>没有找到匹配的仓库</p>
    {% else %}
        <p>请输入搜索关键词</p>
    {% endif %}
{% endif %}

3. 额外优化建议

  • 视图类选择:CreateView的设计初衷是处理创建资源的POST请求,如果你只是做搜索展示,改用TemplateView会更符合语义,代码也更简洁。
  • 敏感信息保护:不要把token硬编码到代码里,建议用环境变量存储,比如通过os.getenv('GITHUB_TOKEN')来获取。
  • API限流处理:GitHub API有请求次数限制(认证后每小时5000次),如果遇到403状态码,可以读取响应头的X-RateLimit-Remaining字段,提示用户限流情况。

这样调整后,就能正确获取并展示用户搜索关键词对应的仓库列表了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:49:23