Flask 核心概念
什么是 Flask
Flask 是一个用 Python 编写的轻量级 Web 应用框架。它被设计为微框架,核心只包含路由、请求和响应处理等基础组件,其他功能(如数据库集成、表单验证)通过扩展按需添加。这种设计使开发者拥有极大的灵活性和控制权,适合从小型 API 到中等规模 Web 应用的各种场景。
微框架的哲学
Flask 的“微”并不意味着功能缺失,而是指它不会替你做出强制性决策。你可以自由选择模板引擎、数据库层或认证方式,这种无依赖的起点正是它备受欢迎的原因之一。
安装与最小应用
使用 pip 安装 Flask 简单直接:
pip install flask
一个最小的 Flask 应用只需要几行代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
将代码保存为 app.py 后运行,即可在浏览器中通过 http://127.0.0.1:5000 看到输出。
路由与视图函数
路由负责将 URL 映射到代码中的视图函数。Flask 使用装饰器 @app.route() 来定义路由规则。
@app.route('/user/<username>')
def show_user(username):
return f'User: {username}'
- 静态路由:
/about精确匹配。 - 动态路由:
<variable>捕获 URL 中的部分,作为参数传入视图函数。 - 变量转换器:
<int:post_id>可以指定变量类型(string、int、float、path、uuid)。
路由的 HTTP 方法
默认情况下,路由只响应 GET 请求。可以通过 methods 参数指定接受的请求方法:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return process_login()
else:
return show_login_form()
请求对象
Flask 的 request 对象封装了客户端发送的 HTTP 请求的所有信息。
from flask import request
@app.route('/search')
def search():
keyword = request.args.get('q') # 查询参数
language = request.headers.get('Accept-Language') # 请求头
return f'Searching for: {keyword}'
常用属性包括:
request.method:请求方法(GET、POST 等)request.form:表单数据(POST 时的键值对)request.args:URL 查询参数request.files:上传的文件request.json:解析为字典的 JSON 数据(需设置请求头为application/json)
响应对象
视图函数的返回值会被 Flask 自动转换为响应对象。你可以显式构造更丰富的响应。
from flask import make_response, jsonify
@app.route('/api/data')
def data():
return jsonify(name='Flask', version='2.3') # 返回 JSON
@app.route('/custom')
def custom():
resp = make_response('Custom response', 200)
resp.headers['X-Custom'] = 'value'
return resp
make_response()可以创建带有自定义状态码和响应头的响应。jsonify()是返回 JSON 数据的快捷方式,自动设置 Content-Type。
模板渲染
Flask 默认使用 Jinja2 模板引擎,可以将动态数据注入 HTML 页面。
from flask import render_template
@app.route('/hello/<name>')
def hello_name(name):
return render_template('hello.html', name=name)
模板文件 hello.html:
<!doctype html>
<title>Hello</title>
<h1>Hello, {{ name }}!</h1>
模板中还可以使用控制结构({% if %}、{% for %})、继承和宏来构建复杂的页面。
静态文件
默认情况下,Flask 会在应用根目录下的 static 文件夹中查找静态资源(CSS、JS、图片等)。
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
url_for('static', filename='...')是生成静态文件 URL 的安全方式。
上下文与钩子
Flask 提供了请求钩子,让你在处理请求前后执行代码:
| 钩子 | 描述 |
|---|---|
before_request |
在每次请求之前运行 |
after_request |
在成功响应后运行(可修改响应) |
teardown_request |
即使发生异常也会运行 |
@app.before_request
def load_user():
if 'user_id' in session:
g.user = get_user(session['user_id'])
g对象是请求级别的全局变量,用于在请求期间存储临时数据。session是加密的客户端 cookie,用于跨请求保存用户状态。
错误处理
通过注册错误处理器自定义错误页面:
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'), 404
常用 HTTP 错误码均可以这种方式处理,提升用户体验。
配置管理
Flask 允许通过 app.config 来存储配置变量:
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'your-secret-key-here'
推荐从单独的文件或环境变量加载配置:
app.config.from_pyfile('config.py')
app.config.from_envvar('APP_SETTINGS')
Flask 扩展与生态
Flask 拥有丰富的扩展库,一些常用扩展包括:
- Flask‑SQLAlchemy:数据库集成
- Flask‑WTF:表单处理与验证
- Flask‑Login:用户会话管理
- Flask‑Migrate:数据库迁移
- Flask‑RESTful:快速构建 REST API
正式开发中,通常使用“应用工厂”模式创建应用实例,以便更好地进行测试和配置管理。
小结
理解 Flask 的核心概念——路由、请求与响应、模板、静态文件、上下文钩子和配置——是构建扎实 Web 应用的基础。其简洁的设计和强大的扩展生态让开发者能够快速搭建从原型到生产级的应用。接下来,你将能够基于这些知识探索更多高级主题,如蓝图(Blueprint)组织代码、数据库集成以及部署方案。