前言
在 Python 的 Web 开发生态中,Django 和 Flask 是最常被提及的两大框架。如果说 Django 是"大而全"的重型框架,那 Flask 就是典型的"微框架"(Microframework)------它核心简洁,只提供 Web 开发最基础的能力(路由、请求处理、模板渲染),其余功能(数据库、表单验证、用户认证等)都通过扩展(Extension)按需引入。
正因为这种"轻量、灵活、易上手"的特点,Flask 非常适合用来做小型项目、API 服务、原型验证,甚至是很多大型项目的技术选型(例如 Pinterest、Linkedin 的部分服务就使用了 Flask)。
本文将带你了解 Flask 的核心概念,并通过一个完整的小例子,让你在 10 分钟内跑起属于自己的第一个 Flask 应用。
一、Flask 是什么?
Flask 由 Armin Ronacher 开发,基于两个核心组件:
- Werkzeug:一个 WSGI(Web Server Gateway Interface)工具库,负责底层的请求/响应处理。
- Jinja2:一个功能强大的模板引擎,用于渲染 HTML 页面。
Flask 本身的代码量很小,它不会替你决定"应该用什么数据库""应该用什么方式做用户认证",这些都交给开发者自己选择,因此也被称为"约定优于配置"理念的反面------Flask 追求的是"配置优于约定",给开发者最大的自由度。
Flask 的主要特点
- 轻量简洁:核心功能少而精,学习曲线平缓
- 路由灵活:通过装饰器即可定义 URL 路由,代码直观
- 内置开发服务器与调试器:开发阶段无需额外配置即可快速调试
- 模板引擎支持:内置 Jinja2,方便渲染动态 HTML
- 易于扩展:Flask-SQLAlchemy(数据库)、Flask-Login(用户认证)、Flask-RESTful(API 开发)等扩展生态成熟
- RESTful 支持友好:非常适合用来快速搭建 API 服务
二、环境准备
在开始之前,确保你已经安装了 Python(建议 3.8 及以上版本)。
1. 创建虚拟环境(推荐)
使用虚拟环境可以避免不同项目之间的依赖冲突:
bash
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS / Linux:
source venv/bin/activate
2. 安装 Flask
bash
pip install flask
安装完成后,可以通过以下命令查看版本,确认安装成功:
bash
python -c "import flask; print(flask.__version__)"
三、动手实践:第一个 Flask 应用
1. 最小可运行示例
新建一个文件 app.py,写入以下代码:
python
from flask import Flask
# 创建 Flask 应用实例
app = Flask(__name__)
# 定义路由:访问根路径时执行的函数
@app.route('/')
def hello_world():
return '<h1>Hello, Flask!</h1><p>欢迎来到我的第一个 Flask 应用~</p>'
if __name__ == '__main__':
# debug=True 表示开启调试模式,代码修改后会自动重启服务
app.run(debug=True)
在终端运行:
bash
python app.py
看到类似下面的输出就说明启动成功了:
* Serving Flask app 'app'
* Debug mode: on
* Running on http://127.0.0.1:5000
打开浏览器访问 http://127.0.0.1:5000,就能看到页面上显示 "Hello, Flask!" 了。
2. 进阶一点:动态路由 + 请求参数 + 简单模板
只有一个静态页面还不够有趣,我们来做一个稍微完整点的例子:一个可以传入姓名、并支持 GET 表单查询的问候页面。
项目结构:
flask_demo/
├── app.py
└── templates/
└── index.html
templates/index.html:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Flask 问候示例</title>
<style>
body { font-family: "Microsoft YaHei", sans-serif; max-width: 600px; margin: 60px auto; }
input, button { font-size: 16px; padding: 6px 10px; }
.greeting { color: #2c7be5; font-size: 20px; margin-top: 20px; }
</style>
</head>
<body>
<h2>👋 Flask 小小问候程序</h2>
<form method="get" action="/greet">
<input type="text" name="name" placeholder="请输入你的名字" required>
<button type="submit">问候我</button>
</form>
{% if name %}
<p class="greeting">你好,{{ name }}!现在是 {{ now }},欢迎学习 Flask 🎉</p>
{% endif %}
</body>
</html>
app.py:
python
from datetime import datetime
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
# 渲染首页表单
return render_template('index.html', name=None)
@app.route('/greet')
def greet():
# 获取 URL 查询参数 ?name=xxx
name = request.args.get('name', '').strip()
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return render_template('index.html', name=name, now=now)
@app.route('/api/greet/<username>')
def api_greet(username):
# 动态路由示例,同时演示返回 JSON 数据(适合做 API 接口)
return {
'code': 0,
'message': f'Hello, {username}!',
'timestamp': datetime.now().isoformat()
}
if __name__ == '__main__':
app.run(debug=True)
运行 python app.py 后,依次体验以下几种效果:
- 访问
http://127.0.0.1:5000/,可以看到一个输入框,输入名字提交后会跳转到/greet并显示问候语------这演示了模板渲染 与 GET 参数获取。 - 直接访问
http://127.0.0.1:5000/api/greet/张三,会看到一段 JSON 数据------这演示了动态路由 (<username>)以及 Flask 如何把 Python 字典自动转换成 JSON 响应,这也是写 RESTful API 时最常用的写法。
3. 代码要点解析
@app.route('/path'):这是 Flask 的路由装饰器,把某个 URL 路径和一个视图函数绑定起来。render_template():从templates文件夹中查找 HTML 文件并渲染,支持 Jinja2 模板语法(如{``{ 变量 }}、{% if %}等)。request.args:获取 URL 中?key=value形式的查询参数;如果是表单 POST 提交,则使用request.form。<username>这种写法叫动态路由 ,Flask 会自动把 URL 中对应位置的值作为参数传给视图函数,还可以加类型限定,比如<int:user_id>。- 视图函数直接
return一个字典,Flask 会自动帮你转换成 JSON 响应,这在写接口时非常方便。
四、常用扩展一览
当项目变得复杂时,你通常会用到以下扩展:
| 扩展 | 用途 |
|---|---|
| Flask-SQLAlchemy | ORM,方便操作数据库 |
| Flask-Migrate | 数据库版本迁移管理 |
| Flask-Login | 用户登录状态管理 |
| Flask-WTF | 表单处理与 CSRF 防护 |
| Flask-RESTful | 更规范地构建 RESTful API |
| Flask-CORS | 处理跨域请求 |
五、总结
通过本文,我们了解了:
- Flask 是一个轻量、灵活的 Python Web 微框架,核心基于 Werkzeug 和 Jinja2;
- 通过几行代码就能跑起一个 Web 服务,路由用装饰器声明,非常直观;
- 结合
render_template和动态路由,可以快速搭建带页面交互的应用; - 直接
return字典即可实现 JSON 接口,非常适合做前后端分离的后端服务。
Flask 的哲学是"给你砖头,不限制你怎么盖房子",正因如此,它既能拿来写一个简单的个人主页,也能作为大型项目的 API 服务骨架。如果你正在学习 Python Web 开发,Flask 会是一个非常友好的起点。
后续我会继续分享 Flask 结合数据库(SQLAlchemy)、用户登录(Flask-Login)以及部署上线(Gunicorn + Nginx)的实战内容,欢迎关注~
参考资料
- Flask 官方文档:https://flask.palletsprojects.com/
- Jinja2 官方文档:https://jinja.palletsprojects.com/