我的项目6:前十新闻应用(使用 Flask + Hacker News API)
Source: Dev.to
请提供您希望翻译的具体文本内容,我将为您翻译成简体中文并保留原始的格式、Markdown 语法以及技术术语。谢谢!
📖 介绍
在学习德语时,我经常使用新闻文章进行阅读练习。
但有时要快速获取新闻并不容易,尤其是当我只想要一个简单的标题列表来浏览时。
于是我决定构建一个小项目,自动获取最新的头条新闻并在简洁、直观的界面中展示。
这样,我既能轻松查看新闻,又能通过使用 Flask 和外部 API 构建实用的东西来学习。
🧱 1. 项目概述
一个最小化的 Flask Web 应用,获取 Hacker News 的 前 10 条新闻 并显示它们的标题和 URL。
本项目演示的内容
- 获取外部 API 数据
- JSON 解析
- Flask 路由与模板渲染
- 将后端数据传递给 HTML
- 使用 Tailwind CSS 进行 UI 样式设计
小巧却非常适合学习 API 集成。
📂 2. 项目结构
news_app/
│
├── app.py # Main Flask app
├── tempCodeRunnerFile.py # Auto‑generated runner file (VS Code)
└── templates/
└── index.html # Front‑end template
📝 什么是 tempCodeRunnerFile.py?
VS Code 在你运行单个文件或选定代码时会自动生成此文件。
它包含与 app.py 相同的逻辑,但仅用于临时执行。
我在博客中把它放在这里,以便项目结构与我本地的真实文件夹完全一致。
🌐 3. 使用的 API — Hacker News API
Hacker News 提供一个托管在 Firebase 上的免费 JSON API。
顶部故事 ID 列表
https://hacker-news.firebaseio.com/v0/topstories.json
获取单个故事
https://hacker-news.firebaseio.com/v0/item/.json
我们只需获取顶部故事列表并取前 10 条。
🖥️ 4. 后端代码 — app.py
from flask import Flask, render_template
import requests
app = Flask(__name__)
TOP_STORIES_URL = "https://hacker-news.firebaseio.com/v0/topstories.json"
ITEM_URL = "https://hacker-news.firebaseio.com/v0/item/{}.json"
@app.route("/")
def index():
# 1) Fetch top story IDs
ids = requests.get(TOP_STORIES_URL).json()
# 2) Retrieve the top 10 stories
news_list = []
for item_id in ids[:10]:
item = requests.get(ITEM_URL.format(item_id)).json()
news_list.append({
"title": item.get("title"),
"url": item.get("url")
})
# 3) Render the HTML template
return render_template("index.html", news=news_list)
if __name__ == "__main__":
app.run(debug=True)
📄 5. tempCodeRunnerFile.py (自动生成)
from flask import Flask, render_template
import requests
app = Flask(__name__)
TOP_STORIES_URL = "https://hacker-news.firebaseio.com/v0/topstories.json"
ITEM_URL = "https://hacker-news.firebaseio.com/v0/item/{}.json"
@app.route("/")
def index():
ids = requests.get(TOP_STORIES_URL).json()
news_list = []
for item_id in ids[:10]:
item = requests.get(ITEM_URL.format(item_id)).json()
news_list.append({
"title": item.get("title"),
"url": item.get("url")
})
return render_template("index.html", news=news_list)
if __name__ == "__main__":
app.run(debug=True)
🎨 6. 前端模板 — templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Top News</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap');
body { font-family: 'Inter', sans-serif; }
</style>
</head>
<body>
<h2>Top News</h2>
<h3>Hacker News Top 10</h3>
{% for item in news %}
<div>
<span>{{ loop.index }}</span>
<strong>{{ item.title }}</strong>
{% if item.url %}
<a href="{{ item.url }}">{{ item.url }}</a>
{% else %}
<span>No link available</span>
{% endif %}
</div>
{% endfor %}
</body>
</html>
就这样!运行 app.py,在浏览器中打开 http://127.0.0.1:5000/,你将看到最新的十条 Hacker News 标题,以简洁的 Tailwind 风格 UI 展示。祝编码愉快!
7. 如何运行
安装依赖
pip install flask requests
运行应用
python app.py
在浏览器中打开
http://127.0.0.1:5000
📚 8. 我学到的
- 如何使用公共 API
- 如何正确解析 JSON
- Flask 路由 + 渲染 的工作原理
- 如何将 API 数据传入 HTML 模板
- 使用 TailwindCSS 构建基础 UI
一个轻量但非常实用的项目。
📌 9. Future Improvements (Easy Tasks)
- 显示 20、30 或 50 条热门故事
- 显示作者姓名和得分
- 添加“时间前”格式
- 添加暗/亮模式切换
- 添加搜索/过滤功能
Template snippet (for reference)
{{ item.url }}
{% endif %}
{% endfor %}
{% if not news %}
No news available.
{% else %}
Data provided by Hacker News API
{% endif %}