无法通过Django调用Hacker News API实现搜索功能求助
问题分析与修复方案
核心错误点
- 表单与视图参数不匹配:表单输入框的
name是item-id,但视图里判断的是request.GET中是否存在search字段,导致永远进不了搜索逻辑分支。 - API调用路径错误:你想获取不同类型(jobs、stories、ask)的内容列表,但第一个请求调用了单条内容的接口
/v0/item/{item-id}.json,这个接口返回的是单个对象而非ID列表,后续循环直接报错。 - 未使用正确API端点:Hacker News获取不同类型内容列表的官方接口分别是
/v0/jobs.json(工作)、/v0/topstories.json(热门故事)、/v0/askstories.json(提问),你没有对应调用这些接口。
修复后的完整代码
视图函数(Python)
def search(request): context = {'objects': []} # 匹配表单传入的类型参数 if 'content_type' in request.GET: content_type = request.GET['content_type'] # 映射类型到对应的API端点 api_map = { 'jobs': 'https://hacker-news.firebaseio.com/v0/jobs.json', 'stories': 'https://hacker-news.firebaseio.com/v0/topstories.json', 'ask': 'https://hacker-news.firebaseio.com/v0/askstories.json' } # 过滤非法类型 if content_type in api_map: # 获取对应类型的内容ID列表 response = requests.get(api_map[content_type]) article_ids = response.json()[:10] # 逐个获取单条内容详情 for item_id in article_ids: item_url = f"https://hacker-news.firebaseio.com/v0/item/{item_id}.json" item_res = requests.get(item_url) context['objects'].append(item_res.json()) return render(request, 'SyncNews/search.html', context)
前端表单(HTML)
<form method="GET" action="{% url 'search' %}"> <!-- 用下拉框让用户选择要搜索的内容类型,更直观 --> <select name="content_type"> <option value="jobs">工作</option> <option value="stories">热门故事</option> <option value="ask">提问</option> </select> <button type="submit">搜索</button> </form>
Django模板
{% for item in objects %} <h3 class="news-subheading">{{ item.title }}</h3> {% if item.url %} <p><a href="{{ item.url }}">查看原文</a></p> {% endif %} {% empty %} <p>暂无相关内容</p> {% endfor %}
补充说明
- 增加了类型合法性检查,避免用户输入无效类型导致的错误。
- 模板中加入
{% empty %}分支,处理无内容的情况,不会出现空页面。 - 补充了原文链接的展示,符合Hacker News的内容特性。
内容的提问来源于stack exchange,提问作者Chuks
相关产品推荐
相关产品推荐

