魔神公寓
94.55M · 2026-04-07
很多人在学习Web开发时,都会被各种框架的复杂性吓退——配置文件一大堆,目录结构看不懂,概念抽象难理解。每次打开教程,看到那些"中间件"、"ORM"、"路由"等专业术语,都有种"我是不是不适合编程"的挫败感。
说实话,这里可能存在一个误解:并不是所有Web框架都那么复杂。Flask就是这样一个"反其道而行之"的轻量级框架,它的设计哲学是"微核心+按需扩展":
更重要的是,Flask让你真正理解Web开发的核心原理,而不是仅仅学会使用某个框架的API。当你在Flask中定义一个路由时,你能清楚地知道这个URL是如何与Python函数关联的;当你渲染一个模板时,你能明白数据是如何传递到HTML页面的。
在开始写代码之前,先看看我们将在10分钟内完成的项目:
技术栈亮点:
首先确保你的电脑上安装了Python 3.7或更高版本。打开终端(Windows用户打开命令提示符或PowerShell),输入:
python --version
# 或
python3 --version
如果显示版本号大于3.7,恭喜你,第一步已完成!如果未安装,访问Python官网下载安装。
虚拟环境就像一个"隔离的沙箱",让不同项目的依赖互不干扰:
# 创建项目目录
mkdir my_blog
cd my_blog
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows:
venvScriptsactivate
# macOS/Linux:
source venv/bin/activate
激活后,终端提示符前会出现(venv)字样。
在虚拟环境中,安装我们需要的包:
pip install flask flask-sqlalchemy
安装完成后,可以验证一下:
python -m flask --version
创建一个名为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(" 数据库表创建成功!")
代码解析:
Flask(__name__)创建Flask应用实例SQLALCHEMY_DATABASE_URI配置SQLite数据库路径Article类定义了文章的数据结构(ORM模型)db.create_all()自动创建数据库表在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模板并传递数据创建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(关于页面) 的完整代码见配套文件。
在app.py文件末尾添加:
# 启动应用
if __name__ == '__main__':
print(" Flask博客应用启动中...")
print(" 访问地址:0")
app.run(debug=True, host='0.0.0.0', port=5000)
然后在终端运行:
python app.py
打开浏览器,访问,你的个人博客就运行起来了!
Flask遵循标准的Web请求-响应模式:
当你在Flask中定义@app.route('/about')时,Flask内部做了三件事:
/about注册到路由表about()函数注册为视图函数访问/about时,Flask的路由器:
Flask使用Jinja2模板引擎,渲染过程分为三步:
templates目录读取HTML文件{{ variable }}替换为实际值{% if %}、{% for %}等控制语句模板继承的优势:
base.html定义整体布局和样式{% extends "base.html" %}继承基础模板{% block content %}部分内容Flask-SQLAlchemy将数据库操作转化为Python对象操作:
Article类对应数据库中的articles表title = db.Column(...)对应表中的列new_article = Article(...)创建新记录ORM的三大优势:
很多技术博客使用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)
增加用户认证功能,保护文章管理:
# 安装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():
# ...
让博客内容更有组织性:
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')
让全世界都能访问你的博客:
Gunicorn启动命令:
gunicorn -w 4 -b 0.0.0.0:8000 app:app
支持前后端分离,让其他应用也能访问数据:
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])
原因:未安装Flask或不在虚拟环境中
解决:
# 确保虚拟环境已激活
source venv/bin/activate # 或 venvScriptsactivate
# 重新安装Flask
pip install flask
原因:SQLAlchemy配置错误或权限问题
解决:
# 检查数据库URI配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
# 确保有写入权限
import os
print("当前目录:", os.getcwd())
原因:模板文件不在templates目录或路径错误
解决:
templates目录在应用同级目录原因:其他程序正在使用5000端口
解决:
# 修改端口号
app.run(debug=True, port=5001)
# 或查找并关闭占用端口的程序
# netstat -ano | findstr :5000
原因:编码设置不正确
解决:
# 在HTML模板中添加
<meta charset="UTF-8">
# 在Python文件中添加
# -*- coding: utf-8 -*-
现在,你已经掌握了Flask的核心概念和实用技巧。接下来,最好的学习方式就是立即动手实践:
python app.py启动应用base.html中的样式,打造独特界面Web开发并不神秘,也不遥远。通过Flask这个轻量级框架,你可以在10分钟内搭建一个真实的、可运行的Web应用。这个过程不仅让你掌握实用的编程技能,更重要的是建立"我能做到"的信心。
记住,每一个复杂的项目都是由简单的代码开始。你的第一个Flask博客,就是通往Web开发世界的大门。从今天开始,用代码表达想法,用技术创造价值,成为真正的创造者。
现在,打开你的编辑器,写下第一行Flask代码。10分钟后,你将拥有自己的个人博客!
本文所有代码文件已整理到outputs/code/第11篇-Flask入门如此简单!10分钟搭建可运行的个人博客雏形/目录,包含:
app.py - 主应用文件,完整功能实现
requirements.txt - 依赖包列表
templates/ - 所有HTML模板文件
test_app.py - 应用测试脚本
快速启动步骤:
# 1. 进入项目目录
cd outputs/code/第11篇-Flask入门如此简单!10分钟搭建可运行的个人博客雏形
# 2. 创建虚拟环境(可选但推荐)
python -m venv venv
source venv/bin/activate # Windows: venvScriptsactivate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 启动应用
python app.py
# 5. 访问
代码特点:
现在,开始你的Flask之旅吧!