Flask 是一个用 Python 编写的轻量级 Web 应用框架,它被称为“微框架”(Micro-framework),不是因为它的功能少,而是因为它核心简单、高度灵活、可扩展性强,它没有像 Django 那样内置数据库抽象层、表单验证等功能,而是将这些选择权交给开发者,让你可以根据项目需求自由选择最适合的工具。

Flask 的核心思想与特点
核心思想:
- 简单易用: Flask 的 API 设计非常直观,上手极快。
- 轻量级: 核心代码库非常小,没有多余的依赖。
- 高度灵活: “约定优于配置”的理念体现得淋漓尽致,你可以自由选择数据库、ORM、模板引擎等。
- 扩展性强: 拥有一个活跃的社区,提供了大量的官方和第三方扩展(Extensions),可以轻松添加各种功能,如用户认证、数据库集成、RESTful API 等。
主要特点:
- Werkzeug 和 Jinja2: Flask 的基石。
- Werkzeug: 一个强大的 WSGI 工具库,处理了 HTTP 请求、响应、路由等底层细节,Flask 在其上构建了更友好的 API。
- Jinja2: 一个现代化的、功能齐全的模板引擎,用于将 Python 逻辑与前端 HTML 分离。
- 开发服务器和调试器: 内置的开发服务器非常方便,并且有一个交互式的调试器,在出错时能提供详细的堆栈信息,便于开发。
- 单元测试支持: Flask 内置了对单元测试的支持,让编写和维护测试变得容易。
- RESTful 请求处理: 轻松构建 RESTful API,
@app.route装饰器可以指定 HTTP 方法(GET, POST, PUT, DELETE 等)。 - Cookies 和 Session: 内置了对 Cookies 和基于 Cookies 的 Session 的支持。
快速上手:安装与第一个应用
安装 Flask
你需要安装 Flask,推荐使用虚拟环境来管理项目依赖。
# 创建并激活一个虚拟环境 (推荐) python -m venv venv # Windows venv\Scripts\activate # macOS/Linux source venv/bin/activate # 安装 Flask pip install Flask
创建第一个 Flask 应用
创建一个名为 app.py 的文件,并写入以下代码:
# 1. 导入 Flask 类
from flask import Flask
# 2. 创建一个 Flask 应用实例
# __name__ 是一个 Python 预定义变量,它表示当前模块的名称。
# Flask 用这个名称来确定应用的根目录,以便之后能找到资源文件。
app = Flask(__name__)
# 3. 定义一个路由和视图函数
# @app.route 是一个装饰器,它告诉 Flask 哪个 URL 应该触发我们的函数。
# '/' 是网站的根路径。
@app.route('/')
def hello_world():
# 视图函数的返回值就是响应给用户的内容。
# 默认情况下,这个返回值会被当作 HTML 来处理。
return '<h1>Hello, Flask World!</h1>'
# 4. 运行应用
# if __name__ == '__main__': 确保这个脚本只有在直接运行时才会启动开发服务器。
if __name__ == '__main__':
# app.run() 启动 Flask 的开发服务器。
# debug=True 会在代码修改后自动重载服务器,并开启调试模式。
app.run(debug=True)
运行应用
在终端中运行 app.py:
python app.py
你会看到类似下面的输出:

* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: ...
打开你的浏览器,访问 http://127.0.0.1:5000,你就能看到 "Hello, Flask World!" 了。
Flask 的核心概念详解
a. 路由
路由负责将 URL 映射到处理该请求的视图函数上。
# 基本路由
@app.route('/user')
def user():
return 'This is the user page'
# 动态路由
# <username> 是一个变量部分,它会作为关键字参数传递给视图函数。
@app.route('/user/<username>')
def show_user_profile(username):
# 显示用户名的个人资料页面
return f'User: {username}'
# 带有数据类型的动态路由
# <int:post_id> 确保传入的是整数,如果不是会返回 404 错误。
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
# HTTP 方法
# 默认只响应 GET 请求,可以通过 methods 参数指定其他方法。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 处理登录逻辑
return 'Processing Login...'
else:
# 显示登录表单
return 'Show Login Form'
b. 视图函数
视图函数是处理请求并返回响应的 Python 函数,响应可以是简单的字符串、HTML、JSON 数据,或者更复杂的对象。
c. 模板
为了将业务逻辑和表现层分离,Flask 使用 Jinja2 模板引擎。

-
创建模板文件夹:在你的项目根目录下创建一个名为
templates的文件夹。 -
创建模板文件:在
templates文件夹中创建一个index.html文件。<!-- templates/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> </head> <body> <h1>Hello, {{ name }}!</h1> <p>This is a paragraph from a template.</p> </body> </html> -
在 Flask 中渲染模板:使用
render_template函数。from flask import render_template @app.route('/home') def home(): # render_template 会自动在 templates 文件夹中查找文件 return render_template('index.html', title='Home Page', name='Flask Learner')模板中的 用于输出变量值。
d. 静态文件
CSS、JavaScript、图片等静态文件应该存放在一个名为 static 的文件夹中。
/my_flask_app
├── app.py
├── static/
│ ├── css/
│ │ └── style.css
│ └── js/
│ └── main.js
└── templates/
└── index.html
在 HTML 中引用这些文件:
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
url_for('static', filename='...') 是 Flask 提供的函数,用于生成静态文件的 URL。
e. 请求与响应
在 Flask 中,你可以通过全局的 request 对象来访问当前请求的所有信息(如请求头、表单数据、JSON 数据等)。
from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
# request.form 是一个类似字典的对象,包含 POST 请求的表单数据
if request.form['username'] == 'admin' and request.form['password'] == 'secret':
return 'Login Successful!'
else:
error = 'Invalid Credentials. Please try again.'
# GET 请求或登录失败时,显示登录表单
return render_template('login.html', error=error)
Flask 扩展
Flask 的强大之处在于其丰富的扩展生态系统。
- Flask-SQLAlchemy: 集成了 SQLAlchemy,这是一个强大的 Python SQL 工具包和对象关系映射器。
- Flask-Login: 处理用户会话管理,包括用户登录、注销、记住我等功能。
- Flask-WTF: 集成了 WTForms,用于处理 Web 表单的创建、验证和渲染。
- Flask-Migrate: 基于 Alembic 的数据库迁移工具,用于管理数据库模式的变更。
- Flask-RESTful: 用于快速构建 RESTful API。
- Flask-JWT-Extended: 用于处理 JSON Web Tokens (JWT)。
Flask vs. Django:如何选择?
这是一个常见的问题,两者都是优秀的 Python Web 框架,但设计哲学不同。
| 特性 | Flask | Django |
|---|---|---|
| 定位 | 微框架 | 全栈框架 |
| 核心理念 | “约定优于配置”,灵活、轻量 | “包含电池”,开箱即用 |
| 数据库 | 无内置,需用扩展(如SQLAlchemy) | 内置 ORM 和强大的 Admin 后台 |
| 模板引擎 | Jinja2 | 自带的 Django Templates |
| 表单处理 | 无内置,需用扩展(如WTForms) | 内置强大的 Forms 库 |
| 用户认证 | 无内置,需用扩展(如Flask-Login) | 内置完整的用户认证系统 |
| 适用场景 | - 小型项目 - API 服务 - 需要高度定制化的项目 - 初学者学习 Web 开发 |
- 大型、复杂的项目 - 内容管理系统 - 需要快速开发的项目 - 企业级应用 |
-
选择 Flask,如果你:
- 喜欢自由和控制权。
- 项目规模不大,或者只需要构建一个 API。
- 想要清晰地了解 Web 应用的每个部分是如何工作的。
- 希望只引入项目真正需要的依赖。
-
选择 Django,如果你:
- 希望快速启动项目,不想自己配置太多东西。
- 需要一个功能齐全的后台管理系统。
- 项目需求复杂,涉及用户、数据库、管理等多种功能。
- 团队协作,需要一个“官方”的、结构化的项目蓝图。
Flask 是一个功能强大且极其灵活的 Python Web 框架,它的“微”并不意味着功能弱,而是将选择权交给了开发者,对于初学者,它能让你快速理解 Web 应用的基本工作原理;对于经验丰富的开发者,它能让你构建出高度定制、性能卓越的应用,如果你正在寻找一个既能满足简单需求,又能支撑复杂项目的框架,Flask 绝对是一个值得学习的优秀选择。
