python Web开发从入门到精通(十一)Flask入门如此简单!10分钟搭建可运行的个人博客雏形

3 阅读1分钟

还在为Web开发的高门槛而犹豫吗?Flask让你用10行代码开启Web开发之旅!本文手把手教你从零开始,10分钟内搭建一个功能完整的个人博客系统,包含文章发布、展示和管理功能。无需复杂配置,跟着步骤走,立即拥有你的第一个Web应用!

引言:为什么选择Flask?

很多人在学习Web开发时,都会被各种框架的复杂性吓退——配置文件一大堆,目录结构看不懂,概念抽象难理解。每次打开教程,看到那些"中间件"、"ORM"、"路由"等专业术语,都有种"我是不是不适合编程"的挫败感。

说实话,这里可能存在一个误解:并不是所有Web框架都那么复杂。Flask就是这样一个"反其道而行之"的轻量级框架,它的设计哲学是"微核心+按需扩展":

  • 核心极简:安装包只有1MB左右,核心功能就是路由和模板渲染
  • 学习曲线平缓:10分钟就能写出第一个可运行的Web应用
  • 灵活扩展:需要什么功能(数据库、表单、认证)再安装对应扩展
  • Python原生:完全遵循Python的简洁哲学,代码直观易懂

更重要的是,Flask让你真正理解Web开发的核心原理,而不是仅仅学会使用某个框架的API。当你在Flask中定义一个路由时,你能清楚地知道这个URL是如何与Python函数关联的;当你渲染一个模板时,你能明白数据是如何传递到HTML页面的。

效果展示:10分钟后你会得到什么?

在开始写代码之前,先看看我们将在10分钟内完成的项目:

  1. 完整的博客系统:支持文章的发布、查看、删除
  2. 现代简洁的界面:响应式设计,适配手机和电脑
  3. 真实的数据库:使用SQLite存储文章数据,无需额外安装
  4. 可运行的程序:一行命令启动,立即在浏览器中访问

技术栈亮点

  • 后端:Flask 3.1 + Flask-SQLAlchemy
  • 数据库:SQLite(嵌入式,零配置)
  • 前端:HTML5 + CSS3 + Jinja2模板
  • 总代码量:不到200行Python代码

准备工作:3分钟完成环境配置

步骤1:安装Python(已安装可跳过)

首先确保你的电脑上安装了Python 3.7或更高版本。打开终端(Windows用户打开命令提示符或PowerShell),输入:

python --version
# 或
python3 --version

如果显示版本号大于3.7,恭喜你,第一步已完成!如果未安装,访问Python官网下载安装。

步骤2:创建虚拟环境(推荐)

虚拟环境就像一个"隔离的沙箱",让不同项目的依赖互不干扰:

# 创建项目目录
mkdir my_blog
cd my_blog

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate

激活后,终端提示符前会出现(venv)字样。

步骤3:安装Flask和相关扩展

在虚拟环境中,安装我们需要的包:

pip install flask flask-sqlalchemy

安装完成后,可以验证一下:

python -m flask --version

核心教学:7分钟完成博客开发

第1步:创建主应用文件(2分钟)

创建一个名为app.py的文件,写入以下内容:

"""
Flask个人博客雏形 - 10分钟快速入门
一个完整的、可运行的Flask博客应用,包含文章发布、展示和管理功能。
"""

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import os

# 初始化Flask应用
app = Flask(__name__)

# 配置数据库 - 使用SQLite(无需额外安装数据库服务器)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'dev-secret-key-2026'

# 初始化数据库
db = SQLAlchemy(app)

# 定义数据模型 - 文章表
class Article(db.Model):
    """
    文章数据模型
    对应数据库中的articles表,存储博客文章信息
    """
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100), nullable=False)
    content = db.Column(db.Text, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.now)
    
    def __repr__(self):
        return f'<Article {self.id}: {self.title}>'

# 创建数据库表(如果不存在)
with app.app_context():
    db.create_all()
    print("✅ 数据库表创建成功!")

代码解析

  1. Flask(__name__)创建Flask应用实例
  2. SQLALCHEMY_DATABASE_URI配置SQLite数据库路径
  3. Article类定义了文章的数据结构(ORM模型)
  4. db.create_all()自动创建数据库表

第2步:添加路由功能(2分钟)

app.py文件中继续添加以下路由:

# 首页路由 - 显示所有文章
@app.route('/')
def index():
    articles = Article.query.order_by(Article.created_at.desc()).all()
    return render_template('index.html', articles=articles)

# 文章详情页路由
@app.route('/article/<int:article_id>')
def article_detail(article_id):
    article = Article.query.get_or_404(article_id)
    return render_template('article_detail.html', article=article)

# 添加新文章路由
@app.route('/add', methods=['GET', 'POST'])
def add_article():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']
        
        if not title or not content:
            flash('标题和内容都不能为空!', 'error')
            return redirect(url_for('add_article'))
        
        new_article = Article(title=title, content=content)
        db.session.add(new_article)
        db.session.commit()
        
        flash(f'文章"{title}"发布成功!', 'success')
        return redirect(url_for('index'))
    
    return render_template('add_article.html')

# 删除文章路由
@app.route('/delete/<int:article_id>')
def delete_article(article_id):
    article = Article.query.get_or_404(article_id)
    db.session.delete(article)
    db.session.commit()
    
    flash(f'文章"{article.title}"已删除', 'info')
    return redirect(url_for('index'))

# 关于页面
@app.route('/about')
def about():
    return render_template('about.html')

路由系统解析

  • @app.route('/'):将URL路径/绑定到index()函数
  • @app.route('/article/<int:article_id>'):动态路由,<int:article_id>捕获URL中的数字
  • methods=['GET', 'POST']:指定该路由支持GET和POST请求
  • render_template():渲染HTML模板并传递数据

第3步:创建HTML模板(2分钟)

创建templates目录,然后创建以下HTML文件:

base.html(基础模板)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}我的个人博客{% endblock %}</title>
    <style>
        /* 完整样式见配套代码文件 */
    </style>
</head>
<body>
    <!-- 页面结构 -->
    {% block content %}{% endblock %}
</body>
</html>

index.html(首页)

{% extends "base.html" %}
{% block content %}
    <h2>📚 所有文章</h2>
    {% if articles %}
        {% for article in articles %}
            <div class="article-card">
                <h3>{{ article.title }}</h3>
                <p>{{ article.content[:150] }}...</p>
                <a href="{{ url_for('article_detail', article_id=article.id) }}">阅读全文</a>
            </div>
        {% endfor %}
    {% else %}
        <p>还没有文章,点击"写文章"开始创作吧!</p>
    {% endif %}
{% endblock %}

article_detail.html(文章详情)add_article.html(添加文章)about.html(关于页面) 的完整代码见配套文件。

第4步:启动应用(1分钟)

app.py文件末尾添加:

# 启动应用
if __name__ == '__main__':
    print("🚀 Flask博客应用启动中...")
    print("🌐 访问地址:http://127.0.0.1:5000")
    app.run(debug=True, host='0.0.0.0', port=5000)

然后在终端运行:

python app.py

打开浏览器,访问http://127.0.0.1:5000,你的个人博客就运行起来了!

原理揭秘:Flask如何工作?

1. 请求-响应循环

Flask遵循标准的Web请求-响应模式:

  1. 用户在浏览器输入URL或点击链接
  2. 浏览器向服务器发送HTTP请求
  3. Flask根据URL匹配路由规则
  4. 调用对应的视图函数处理请求
  5. 函数返回响应内容(HTML、JSON等)
  6. 服务器将响应发送回浏览器
  7. 浏览器渲染页面

2. 路由系统的工作原理

当你在Flask中定义@app.route('/about')时,Flask内部做了三件事:

  1. 将URL模式/about注册到路由表
  2. about()函数注册为视图函数
  3. 建立URL与函数的映射关系

访问/about时,Flask的路由器:

  1. 解析请求的URL路径
  2. 在路由表中查找匹配的规则
  3. 调用对应的视图函数
  4. 将函数返回值包装为HTTP响应

3. 模板渲染机制

Flask使用Jinja2模板引擎,渲染过程分为三步:

  1. 加载模板:从templates目录读取HTML文件
  2. 解析变量:将{{ variable }}替换为实际值
  3. 执行逻辑:处理{% if %}{% for %}等控制语句

模板继承的优势

  • base.html定义整体布局和样式
  • 子模板通过{% extends "base.html" %}继承基础模板
  • 子模板只需填充{% block content %}部分内容
  • 实现代码复用,维护方便

4. 数据库ORM的魔法

Flask-SQLAlchemy将数据库操作转化为Python对象操作:

  • 表 → 类Article类对应数据库中的articles
  • 列 → 属性title = db.Column(...)对应表中的列
  • 行 → 对象new_article = Article(...)创建新记录

ORM的三大优势:

  1. 类型安全:Python类型自动映射为SQL类型
  2. 查询友好:使用Python语法而非SQL字符串
  3. 迁移方便:模型变更自动同步到数据库结构

场景延伸:博客还能怎么升级?

场景1:添加Markdown支持

很多技术博客使用Markdown格式写作,可以轻松添加支持:

# 安装Markdown解析库
# pip install markdown

import markdown

@app.route('/article/<int:article_id>')
def article_detail(article_id):
    article = Article.query.get_or_404(article_id)
    # 将Markdown转换为HTML
    article.content = markdown.markdown(article.content)
    return render_template('article_detail.html', article=article)

场景2:实现用户登录系统

增加用户认证功能,保护文章管理:

# 安装Flask-Login
# pip install flask-login

from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required

login_manager = LoginManager(app)

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    password_hash = db.Column(db.String(200))

# 保护需要登录的路由
@app.route('/add', methods=['GET', 'POST'])
@login_required
def add_article():
    # ...

场景3:添加文章分类和标签

让博客内容更有组织性:

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)
    articles = db.relationship('Article', backref='category')

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), unique=True)
    articles = db.relationship('Article', secondary='article_tag', backref='tags')

场景4:部署到云服务器

让全世界都能访问你的博客:

  1. 选择云平台:阿里云、腾讯云、Vercel、Render等
  2. 配置环境:安装Python、设置虚拟环境
  3. 上传代码:使用Git或FTP工具
  4. 启动服务:使用Gunicorn或Waitress生产服务器

Gunicorn启动命令

gunicorn -w 4 -b 0.0.0.0:8000 app:app

场景5:添加RESTful API

支持前后端分离,让其他应用也能访问数据:

from flask import jsonify

@app.route('/api/articles')
def api_articles():
    articles = Article.query.all()
    return jsonify([{
        'id': article.id,
        'title': article.title,
        'created_at': article.created_at.isoformat()
    } for article in articles])

避坑指南:常见问题与解决方案

问题1:导入错误"No module named 'flask'"

原因:未安装Flask或不在虚拟环境中

解决

# 确保虚拟环境已激活
source venv/bin/activate  # 或 venv\Scripts\activate

# 重新安装Flask
pip install flask

问题2:数据库表创建失败

原因:SQLAlchemy配置错误或权限问题

解决

# 检查数据库URI配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'

# 确保有写入权限
import os
print("当前目录:", os.getcwd())

问题3:模板找不到"TemplateNotFound"

原因:模板文件不在templates目录或路径错误

解决

  1. 确保templates目录在应用同级目录
  2. 检查文件名拼写
  3. 使用绝对路径加载模板

问题4:端口5000被占用

原因:其他程序正在使用5000端口

解决

# 修改端口号
app.run(debug=True, port=5001)

# 或查找并关闭占用端口的程序
# netstat -ano | findstr :5000

问题5:中文显示乱码

原因:编码设置不正确

解决

# 在HTML模板中添加
<meta charset="UTF-8">

# 在Python文件中添加
# -*- coding: utf-8 -*-

行动号召:立即动手,创造你的数字作品

现在,你已经掌握了Flask的核心概念和实用技巧。接下来,最好的学习方式就是立即动手实践

第一步:运行现有项目

  1. 下载本文的配套代码
  2. 按照"准备工作"章节配置环境
  3. 运行python app.py启动应用
  4. 在浏览器中体验完整功能

第二步:个性化修改

  1. 修改base.html中的样式,打造独特界面
  2. 添加你的第一篇文章,体验发布流程
  3. 尝试修改路由,添加新的页面功能

第三步:扩展功能

  1. 参考"场景延伸"章节,实现一个扩展功能
  2. 将项目部署到云服务器,分享给朋友访问
  3. 基于这个基础框架,开发你自己的Web应用

学习资源推荐

结语:从今天开始,成为Web开发者

Web开发并不神秘,也不遥远。通过Flask这个轻量级框架,你可以在10分钟内搭建一个真实的、可运行的Web应用。这个过程不仅让你掌握实用的编程技能,更重要的是建立"我能做到"的信心。

记住,每一个复杂的项目都是由简单的代码开始。你的第一个Flask博客,就是通往Web开发世界的大门。从今天开始,用代码表达想法,用技术创造价值,成为真正的创造者。

现在,打开你的编辑器,写下第一行Flask代码。10分钟后,你将拥有自己的个人博客!

配套代码使用说明

本文所有代码文件已整理到outputs/code/第11篇-Flask入门如此简单!10分钟搭建可运行的个人博客雏形/目录,包含:

  1. app.py - 主应用文件,完整功能实现

  2. requirements.txt - 依赖包列表

  3. templates/ - 所有HTML模板文件

    • base.html - 基础布局模板
    • index.html - 首页模板
    • article_detail.html - 文章详情模板
    • add_article.html - 添加文章模板
    • about.html - 关于页面模板
    • 404.html - 404错误页面模板
  4. test_app.py - 应用测试脚本

快速启动步骤

# 1. 进入项目目录
cd outputs/code/第11篇-Flask入门如此简单!10分钟搭建可运行的个人博客雏形

# 2. 创建虚拟环境(可选但推荐)
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 3. 安装依赖
pip install -r requirements.txt

# 4. 启动应用
python app.py

# 5. 访问 http://127.0.0.1:5000

代码特点

  • 完整可运行,无需修改直接使用
  • 详细注释,便于理解和学习
  • 模块化设计,方便扩展和修改
  • 遵循Flask最佳实践,代码规范清晰

现在,开始你的Flask之旅吧!🎉