雷灵模板

Python开发者入门开发:用Flask框架从零搭建个人技术博客API接口并集成Markdown渲染与RSS订阅功能

avatar

雷灵

🤖AI摘要
本文介绍如何使用Flask框架搭建个人技术博客API接口,涵盖Markdown渲染和RSS订阅功能。教程面向新手,步骤详细,从环境准备到数据库设计,再到Flask应用搭建和API开发,全面讲解,无需复杂框架即可上手。通过该教程,开发者可轻松拥有属于自己的技术博客。

在数字化时代,很多Python开发者、站长和SEO从业者都希望拥有一个完全属于自己的技术博客。相比WordPress等现成系统,用Flask框架从零搭建API接口更灵活,能轻松对接任意前端框架,还能集成Markdown渲染和RSS订阅功能。本教程专为新手准备,所有步骤都附带详细解释和代码,无需复杂框架,直接上手即可运行。

一、环境准备与项目初始化

首先确保本地安装Python 3.8及以上版本(推荐3.10+)。打开命令行,创建项目目录并初始化虚拟环境:

mkdir my_blog_api
cd my_blog_api
python -m venv venv
# Windows用户激活:venv\Scripts\activate
# Mac/Linux用户激活:source venv/bin/activate

激活后安装核心依赖(仅两个包,保持轻量):

pip install flask markdown

创建项目文件结构:

my_blog_api/
├── app.py          # 主应用文件
├── init_db.py      # 数据库初始化脚本
├── posts.db        # SQLite数据库(运行后自动生成)
└── requirements.txt

requirements.txt内容:

flask
markdown

二、数据库设计与初始化

个人博客需要存储文章数据,使用内置sqlite3模块即可,无需额外安装。创建init_db.py:

import sqlite3
conn = sqlite3.connect('posts.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content_md TEXT NOT NULL,
created_at TEXT NOT NULL
)
''')
conn.commit()
conn.close()
print("数据库初始化完成!")

运行一次:

python init_db.py

这样就有了posts表,字段简单明了:标题、Markdown原文、创建时间。

三、Flask应用核心搭建

在app.py中写入基础代码:

from flask import Flask, jsonify, request, make_response
import markdown
import sqlite3
from datetime import datetime
app = Flask(__name__)
def get_db():
conn = sqlite3.connect('posts.db')
conn.row_factory = sqlite3.Row  # 返回字典格式
return conn
# 首页测试路由
@app.route('/')
def index():
return "个人技术博客API已启动!访问 /api/posts 查看文章列表"
if __name__ == '__main__':
app.run(debug=True)

运行测试:

python app.py

浏览器打开 http://127.0.0.1:5000,看到启动提示即成功

四、核心API接口开发

1. 获取文章列表(带Markdown渲染)

在app.py添加:

@app.route('/api/posts', methods=['GET'])
def get_posts():
conn = get_db()
cursor = conn.cursor()
cursor.execute('SELECT * FROM posts ORDER BY created_at DESC')
posts = cursor.fetchall()
result = []
for post in posts:
html_content = markdown.markdown(post['content_md'], extensions=['extra', 'codehilite'])  # 支持代码高亮
result.append({
'id': post['id'],
'title': post['title'],
'html_content': html_content,
'created_at': post['created_at']
})
conn.close()
return jsonify(result)

Markdown渲染关键点:使用markdown.markdown()直接把MD转HTML,extensions参数让代码块高亮更美观。新手可直接复制这段,渲染效果开箱即用。

2. 获取单篇文章

@app.route('/api/post/<int:post_id>', methods=['GET'])
def get_post(post_id):
conn = get_db()
cursor = conn.cursor()
cursor.execute('SELECT * FROM posts WHERE id = ?', (post_id,))
post = cursor.fetchone()
if post is None:
return jsonify({'error': '文章不存在'}), 404
html_content = markdown.markdown(post['content_md'], extensions=['extra', 'codehilite'])
conn.close()
return jsonify({
'id': post['id'],
'title': post['title'],
'html_content': html_content,
'created_at': post['created_at']
})

3. 新增文章(简单POST接口)

@app.route('/api/post', methods=['POST'])
def create_post():
data = request.json
title = data.get('title')
content_md = data.get('content_md')
if not title or not content_md:
return jsonify({'error': '标题和内容不能为空'}), 400
created_at = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
conn = get_db()
cursor = conn.cursor()
cursor.execute('INSERT INTO posts (title, content_md, created_at) VALUES (?, ?, ?)',
(title, content_md, created_at))
conn.commit()
new_id = cursor.lastrowid
conn.close()
return jsonify({'message': '文章创建成功', 'id': new_id}), 201

测试新增可用Postman或curl:

curl -X POST http://127.0.0.1:5000/api/post \
-H "Content-Type: application/json" \
-d '{"title": "我的第一篇Flask文章", "content_md": "# Hello\n这是Markdown测试"}'

五、集成RSS订阅功能

RSS能让读者通过Feedly、Inoreader等工具订阅更新,对SEO和流量增长帮助极大。在app.py添加:

@app.route('/rss', methods=['GET'])
def rss_feed():
conn = get_db()
cursor = conn.cursor()
cursor.execute('SELECT * FROM posts ORDER BY created_at DESC LIMIT 20')
posts = cursor.fetchall()
conn.close()
rss_xml = '''<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>雷灵的技术博客</title>
<link>https://yourdomain.com</link>
<description>Python、Flask与运维实战分享</description>
<language>zh-cn</language>
'''
for post in posts:
html_content = markdown.markdown(post['content_md'])[:200] + '...'  # 摘要
rss_xml += f'''
<item>
<title>{post["title"]}</title>
<link>https://yourdomain.com/post/{post["id"]}</link>
<description><![CDATA[{html_content}]]></description>
<pubDate>{post["created_at"]}</pubDate>
</item>
'''
rss_xml += '</channel></rss>'
response = make_response(rss_xml)
response.headers['Content-Type'] = 'application/rss+xml'
return response

访问 http://127.0.0.1:5000/rss 即可看到标准RSS源,直接复制到订阅工具测试。新手注意:实际上线后把link换成真实域名。

六、常见问题排查与优化建议

  • 数据库连接问题:确保posts.db与app.py同目录。
  • Markdown渲染样式:前端调用html_content时可搭配highlight.js美化代码块。
  • 跨域问题:生产环境建议加flask-cors(pip install flask-cors)。
  • 性能优化:文章多时可加缓存(Redis简单集成),运维人员常用此方式。
  • SEO友好:API返回干净JSON和HTML,前端静态化后配合sitemap.xml,百度和谷歌收录更快。

    七、部署与上线指南

    本地测试通过后,推荐部署方式:

    1. 用Gunicorn + Nginx(Linux服务器):
      pip install gunicorn
      gunicorn -w 4 app:app
    2. 云服务器(阿里云/腾讯云)推荐,配合Supervisor守护进程。
    3. 免费方案:Render.com或Railway直接部署Flask应用,绑定自定义域名。
      完成部署后,你的个人技术博客API就具备了文章增删查、Markdown实时渲染、RSS订阅三大核心功能。前端随便用Vue、React甚至纯HTML都能对接,站长和SEO从业者还能轻松扩展搜索接口。
      通过这个完整流程,新手开发者通常1-2天就能跑通整个系统。实际操作中多打印日志、多用Postman验证接口,会让你进步飞快。祝大家早日拥有自己的专业技术博客!
黔ICP备2022004976号
powered by 雷灵模板