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
相关产品推荐
相关产品推荐

