跳到主要内容
Python Flask 轻量级 Web 框架基础指南 | 极客日志
Python
Python Flask 轻量级 Web 框架基础指南 综述由AI生成 Python Flask 轻量级 Web 框架的基础知识。Flask 基于 Werkzeug 和 Jinja2 构建,具有轻量灵活、易学易用等特点,适合小型项目及快速原型开发。文章详细讲解了环境搭建、最小应用结构、路由系统(含动态路由与方法限定)、请求与响应处理、Jinja2 模板引擎、会话管理(Cookie/Session)、蓝图模块化开发、配置管理及钩子函数。此外,还涵盖了常用扩展(如 Flask-SQLAlchemy)的使用以及生产环境下的 Gunicorn+Nginx 部署方案,最后简述了上下文、信号及测试等进阶概念。
奶糖兔 发布于 2026/3/30 更新于 2026/5/24 31 浏览1. Flask 基础认知
Flask 是由 Armin Ronacher 开发的轻量级 Python Web 框架 ,基于 Werkzeug(WSGI 工具集)和 Jinja2(模板引擎)构建,被称为'微框架(Microframework)'——并非功能薄弱,而是核心极简,可通过扩展灵活扩展功能。对比 Django(大而全的框架),Flask 更适合小型项目、快速原型开发或需要高度定制化的场景。
核心特点 :
轻量灵活:核心仅包含路由、请求/响应处理、模板渲染,其余功能通过扩展实现;
易学易用:API 设计简洁,新手可快速上手;
兼容性好:支持 Python 3.6+,兼容主流 WSGI 服务器;
丰富的扩展生态:Flask-SQLAlchemy(数据库)、Flask-WTF(表单)、Flask-Login(用户认证)等。
环境搭建 :
首先推荐使用虚拟环境隔离依赖(避免全局环境污染):
python -m venv flask_env
flask_env\Scripts\activate
source flask_env/bin /activate
pip install flask
python -c "import flask; print(flask.__version__)"
2. 最小应用:Flask 核心骨架
Flask 的最小应用仅需几行代码即可运行,是理解其核心流程的起点:
from flask import Flask
app = Flask(__name__)
@app.route('/' )
def index ():
return 'Hello, Flask!'
if __name__ == '__main__' :
app.run(debug=True , host='0.0.0.0' , port=5000 )
运行脚本后,访问 http://localhost:5000 即可看到'Hello, Flask!',核心要素:
Flask(__name__):创建应用实例,__name__是 Flask 的'应用根目录'标识;
@app.route('/'):路由装饰器,映射 URL 与视图函数;
app.run():启动开发服务器(仅用于开发环境,生产环境需用 Gunicorn/Nginx)。
3. 路由系统:URL 与视图的映射
视图函数(View Function)是 Flask 中绑定到特定 URL 路由的 Python 函数,也是处理 HTTP 请求的核心载体
路由是 Flask 的核心之一,负责将用户请求的 URL 匹配到对应的视图函数,支持多种高级特性:
(1)基本路由与动态路由
@app.route('/about' )
def about ():
return '关于我们'
@app.route('/user/<string:name>' )
def user (name ):
return f'Hello, {name} !'
@app.route('/hi' )
@app.route('/hello' )
def greet ():
return 'Hi there!'
(2)请求方法限定 默认路由仅支持 GET 请求,可通过 methods 参数指定支持的 HTTP 方法(GET/POST/PUT/DELETE 等):
@app.route('/login' , methods=['GET' ,'POST' ] )
def login ():
if request.method == 'POST' :
return '处理登录逻辑'
else :
return '返回登录表单'
(3)路由规则进阶
strict_slashes:控制 URL 末尾的/是否严格匹配(默认 True,/about/与/about视为不同);
redirect_to:路由重定向;
@app.route('/old-path' , strict_slashes=False , redirect_to='/new-path' )
def old_path ():
pass
@app.route('/new-path' )
def new_path ():
return '新路径'
4. 请求与响应处理 Flask 通过 request 对象封装客户端请求数据,通过返回值/make_response 构建响应。
(1)请求对象(request) 需先导入 from flask import request,核心属性:
属性/方法 说明 示例 request.method请求方法(GET/POST 等) if request.method == 'POST'request.argsGET 参数(URL 中的?参数) request.args.get('page', 1)request.formPOST 表单数据 request.form.get('username')request.files上传的文件 request.files['avatar']request.cookies请求中的 Cookie request.cookies.get('token')request.headers请求头信息 request.headers.get('User-Agent')
from flask import Flask, request
app = Flask(__name__)
@app.route('/data' , methods=['GET' ,'POST' ] )
def handle_data ():
if request.method == 'GET' :
name = request.args.get('name' ,'匿名' )
age = request.args.get('age' ,0 ,type =int )
return f'GET 请求:姓名{name} ,年龄{age} '
else :
username = request.form['username' ]
password = request.form.get('password' )
return f'POST 请求:用户名{username} '
if __name__ == '__main__' :
app.run(debug=True )
(2)响应处理
直接返回字符串:自动封装为 Response 对象(默认状态码 200,Content-Type: text/html);
返回元组:(响应内容,状态码,响应头);
使用 make_response 构建自定义响应;
返回 JSON:使用 jsonify(自动设置 Content-Type: application/json)。
from flask import Flask, make_response, jsonify
app = Flask(__name__)
@app.route('/response1' )
def response1 ():
return '自定义状态码' , 404 , {'X-Custom-Header' :'Flask' }
@app.route('/response2' )
def response2 ():
resp = make_response('自定义响应' )
resp.status_code = 201
resp.set_cookie('token' ,'123456' )
resp.headers['Content-Type' ]='text/plain'
return resp
@app.route('/json' )
def return_json ():
data = {'name' :'张三' ,'age' :20 }
return jsonify(data)
if __name__ == '__main__' :
app.run(debug=True )
(3)重定向与错误处理
重定向:使用 redirect,配合 url_for(反向生成 URL,避免硬编码);
错误处理:使用 @app.errorhandler(状态码) 装饰器自定义错误页面。
from flask import Flask, redirect, url_for, abort
app = Flask(__name__)
@app.route('/index' )
def index ():
return '首页'
@app.route('/go-index' )
def go_index ():
return redirect(url_for('index' ))
@app.route('/error' )
def error ():
abort(404 )
@app.errorhandler(404 )
def page_not_found (e ):
return '页面不存在' , 404
@app.errorhandler(500 )
def server_error (e ):
return '服务器内部错误' , 500
if __name__ == '__main__' :
app.run(debug=True )
5. 模板引擎:Jinja2 Flask 内置 Jinja2 模板引擎,用于将 Python 变量渲染到 HTML 中,实现'前后端分离(简易版)',模板文件默认放在项目根目录的 templates 文件夹下。
(1)基本使用 project/
├── app.py
└── templates/
└── index.html
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/' )
def index ():
return render_template('index.html' , name='张三' , age=20 )
if __name__ == '__main__' :
app.run(debug=True )
<!DOCTYPE html >
<html >
<head >
<title > Flask 模板</title >
</head >
<body >
<h1 > Hello, {{ name }}!</h1 >
{# 变量渲染 #}
<p > 年龄:{{ age + 1 }}</p >
{# 支持简单表达式 #}
</body >
</html >
(2)Jinja2 核心语法
变量:{{ 变量名 }},支持字典({{ user.name }}/{{ user['name'] }})、列表({{ list[0] }});
控制结构:{% if/for %},需闭合 {% endif/endfor %};
{# 条件判断 #}
{% if age >= 18 %}
<p > 成年</p >
{% else %}
<p > 未成年</p >
{% endif %}
{# 循环 #}
<ul >
{% for item in ['苹果', '香蕉', '橙子'] %}
<li > {{ loop.index }}: {{ item }}</li >
{# loop.index 是循环索引(从 1 开始) #}
{% endfor %}
</ul >
宏(Macro):类似函数,封装可复用的 HTML 片段;
模板继承:通过 {% extends %}/{% block %} 实现模板复用(核心减少重复代码);
基模板(templates/base.html):
<!DOCTYPE html >
<html >
<head >
<title > {% block title %}默认标题{% endblock %}</title >
</head >
<body >
<div class ="header" > 头部</div >
<div class ="content" >
{% block content %}{% endblock %}
{# 子模板填充的内容 #}
</div >
<div class ="footer" > 底部</div >
</body >
</html >
子模板(templates/home.html):
{% extends 'base.html' %}
{# 继承基模板 #}
{% block title %}首页{% endblock %}
{# 重写 title 块 #}
{% block content %}
<h1 > 首页内容</h1 >
{% endblock %}
{% macro input(name, type='text',) %}
<input type ="{{ type }}" name ="{{ name }}" value ="{{ value }}" >
{% endmacro %}
{# 使用宏 #}
{{ input('username') }}
{{ input('password', type='password') }}
过滤器:修改变量显示格式,{{ 变量 | 过滤器 }},常用:safe(禁用转义)、length(长度)、upper(大写);
{{ '<h1 > 测试</h1 > '|safe }}
{# 渲染为<h1 > 测试</h1 > ,而非转义后的字符串 #}
{{ ['a','b']|length }}
{# 输出 2 #}
{{ 'hello'|upper }}
{# 输出 HELLO #}
6. 会话与状态管理 HTTP 是无状态协议,Flask 通过 Cookie 和 Session 实现状态保持:
(1)Cookie Cookie 是存储在客户端浏览器的小型文本文件,Flask 通过 set_cookie/request.cookies 操作:
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route('/set-cookie' )
def set_cookie ():
resp = make_response('设置 Cookie' )
resp.set_cookie('username' ,'张三' , max_age=3600 )
return resp
@app.route('/get-cookie' )
def get_cookie ():
username = request.cookies.get('username' ,'匿名' )
return f'Cookie 中的用户名:{username} '
if __name__ == '__main__' :
app.run(debug=True )
(2)Session Session 是'服务器端的 Cookie':将敏感数据存储在服务器,仅将加密的 session_id 存储在客户端 Cookie 中,使用前需设置密钥 (SECRET_KEY)用于加密:
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'your-secret-key-123456'
@app.route('/set-session' )
def set_session ():
session['username' ]='张三'
session['age' ]=20
return 'Session 已设置'
@app.route('/get-session' )
def get_session ():
username = session.get('username' ,'匿名' )
age = session.get('age' ,0 )
return f'Session:用户名{username} ,年龄{age} '
@app.route('/clear-session' )
def clear_session ():
session.pop('age' ,None )
return 'Session 已清理'
if __name__ == '__main__' :
app.run(debug=True )
7. 蓝图(Blueprint):模块化开发 当项目规模扩大时,单一 app.py 会变得臃肿,蓝图(Blueprint)可将功能拆分为独立模块(如用户模块、商品模块),实现代码解耦。
project/
├── app.py
├── users /
│ ├── __init__.py
│ └── views.py
└── goods/
├── __init__.py
└── views.py
from flask import Blueprint
user_bp = Blueprint('user' , __name__, url_prefix='/user' )
@user_bp.route('/login' )
def login ():
return '用户登录'
@user_bp.route('/profile' )
def profile ():
return '用户个人中心'
from flask import Blueprint
goods_bp = Blueprint('goods' , __name__, url_prefix='/goods' )
@goods_bp.route('/list' )
def goods_list ():
return '商品列表'
@goods_bp.route('/detail/<int:id>' )
def goods_detail (id ):
return f'商品详情:{id } '
from flask import Flask
from users.views import user_bp
from goods.views import goods_bp
app = Flask(__name__)
app.register_blueprint(user_bp)
app.register_blueprint(goods_bp)
if __name__ == '__main__' :
app.run(debug=True )
访问 http://localhost:5000/user/login(用户登录)、http://localhost:5000/goods/list(商品列表)即可验证,蓝图支持独立的模板/静态文件路径、错误处理等,是 Flask 模块化开发的核心。
8. 配置管理 Flask 支持多种配置方式,核心是 app.config(字典对象),推荐按环境(开发/测试/生产)分离配置:
(1)基本配置方式 from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY' ]='123456'
app.config['DEBUG' ]=True
config = {'SECRET_KEY' :'123456' ,'DEBUG' :True }
app.config.update(config)
class DevelopmentConfig :
DEBUG = True
SECRET_KEY = 'dev-secret-key'
class ProductionConfig :
DEBUG = False
SECRET_KEY = 'prod-secret-key'
app.config.from_object(DevelopmentConfig)
9. 钩子函数(中间件) Flask 提供多个钩子函数,用于在请求处理的不同阶段执行自定义逻辑:
钩子函数 执行时机 before_request每个请求处理前执行 after_request每个请求处理后执行(无异常) teardown_request每个请求处理后执行(无论是否异常) before_first_request第一个请求处理前执行(Flask 2.0+已废弃,改用 app.before_first_request_funcs)
from flask import Flask, request
app = Flask(__name__)
@app.before_request
def log_request ():
print (f'请求路径:{request.path} ,方法:{request.method} ' )
@app.after_request
def add_header (resp ):
resp.headers['X-Processed-By' ]='Flask'
return resp
@app.teardown_request
def teardown (exception ):
if exception:
print (f'请求异常:{exception} ' )
print ('请求处理完成,清理资源' )
@app.route('/' )
def index ():
return 'Hello, Flask!'
if __name__ == '__main__' :
app.run(debug=True )
10. 常用扩展 Flask 的核心功能有限,扩展是其生态的核心,以下是最常用的扩展:
Flask-WTF :封装 WTForms,简化表单验证;
Flask-Login :处理用户登录、登出、会话管理;
Flask-Migrate :基于 Alembic,实现数据库迁移(表结构修改);
Flask-CORS :解决跨域问题(前后端分离项目必备)。
Flask-SQLAlchemy :ORM 框架,简化数据库操作(支持 MySQL/PostgreSQL/SQLite 等);
安装:pip install flask-sqlalchemy
示例:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI' ]='sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS' ]=False
db = SQLAlchemy(app)
class User (db.Model):
id = db.Column(db.Integer, primary_key=True )
username = db.Column(db.String(80 ), unique=True , nullable=False )
email = db.Column(db.String(120 ), unique=True , nullable=False )
def __repr__ (self ):
return f'<User {self.username} >'
@app.route('/add-user' )
def add_user ():
user = User(username='张三' , email='[email protected] ' )
db.session.add(user)
db.session.commit()
return '用户添加成功'
@app.route('/users' )
def get_users ():
users = User.query.all ()
return f'所有用户:{users} '
if __name__ == '__main__' :
app.run(debug=True )
11. 生产环境部署 开发环境的 app.run() 仅用于调试,生产环境需使用WSGI 服务器 (Gunicorn)+ 反向代理 (Nginx):
(1)使用 Gunicorn 启动 Flask 应用 安装:pip install gunicorn
创建 wsgi.py:
from app import app
if __name__ == '__main__' :
app.run()
gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app
(2)配置 Nginx 反向代理 Nginx 负责接收客户端请求,转发到 Gunicorn,同时处理静态文件、负载均衡等:
server {
listen 80;
server_name your-domain.com; # 你的域名
# 静态文件(Flask 的 static 文件夹)
location /static {
alias /path/to/your/project/static;
}
# 转发动态请求到 Gunicorn
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
12. 进阶
上下文 :Flask 有两种核心上下文——应用上下文(app_context)和请求上下文(request_context),request/session属于请求上下文,current_app/g属于应用上下文;
current_app:当前运行的应用实例;
g:全局临时存储,仅在当前请求有效,用于在钩子函数和视图函数间传递数据。
信号 :Flask-Signals(需安装 blinker),用于监听应用事件(如请求开始/结束、模板渲染完成等),实现解耦的事件通知;
测试 :使用 pytest+flask.test_client() 编写单元测试,模拟请求并验证响应。
Flask 是轻量级 Python Web 框架,核心极简但可通过扩展实现复杂功能,适合小型项目/快速原型开发;
核心知识点包括:路由映射、请求/响应处理、Jinja2 模板、Session/Cookie、蓝图(模块化)、配置管理、钩子函数;
生产环境需使用 Gunicorn(WSGI 服务器)+ Nginx(反向代理)部署,避免使用开发服务器;扩展是 Flask 生态的核心,Flask-SQLAlchemy、Flask-WTF 等可大幅提升开发效率。
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online