本文聚焦于 Flask 的基础入门,涵盖安装、第一个应用、基本概念、项目结构、路由与视图函数。
引言
Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它被设计为"微型"框架,但并不意味着它功能薄弱;相反,Flask 提供了构建 Web 应用所需的核心组件,同时保持了极高的灵活性和可扩展性。对于初学者来说,Flask 的学习曲线平缓,能让你快速理解 Web 开发的核心概念;对于高级开发者,Flask 又能通过丰富的扩展支持复杂应用的开发。
本教程将带你从零开始,完成 Flask 的安装,创建第一个 Flask 应用,并深入解析 Flask 的基本概念、项目结构、路由与视图函数。
1. Flask 安装
在开始之前,请确保你的电脑上已经安装了 Python 3.8 或更高版本。推荐使用虚拟环境来隔离项目依赖。
1.1 创建虚拟环境
bash
# 在项目目录下执行
python -m venv venv
1.2 激活虚拟环境
-
Windows :
bashvenv\Scripts\activate -
macOS / Linux :
bashsource venv/bin/activate
1.3 安装 Flask
bash
pip install flask
安装完成后,可以通过以下命令验证是否成功:
bash
python -c "import flask; print(flask.__version__)"
如果正确输出版本号(如 2.3.x),说明安装成功。
2. Flask 第一个应用
我们来创建一个最简单的 Flask 应用,只需几行代码。
2.1 创建 app.py
python
from flask import Flask
# 创建 Flask 实例
app = Flask(__name__)
# 定义路由与视图函数
@app.route('/')
def hello():
return 'Hello, World!'
# 启动应用
if __name__ == '__main__':
app.run(debug=True)
2.2 运行应用
bash
python app.py
终端会输出类似以下内容:
* Serving Flask app 'app'
* Debug mode: on
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
打开浏览器访问 http://127.0.0.1:5000,你将看到 Hello, World!。
2.3 代码解析
Flask(__name__):创建一个 Flask 应用实例。__name__是当前模块的名称,Flask 用它来定位模板和静态文件的位置。@app.route('/'):这是一个装饰器 ,用于将 URL 路径/与下面的函数绑定。当用户访问根路径时,Flask 会调用该函数。return 'Hello, World!':视图函数返回的字符串将作为 HTTP 响应体发送给客户端。app.run(debug=True):启动内置的开发服务器。debug=True开启调试模式,代码修改后服务器会自动重启,并在出错时显示详细的错误页面。
3. Flask 基本概念
在深入开发之前,我们需要理解 Flask 中的几个核心概念。
3.1 应用(Application)
Flask 应用是 Flask 类的一个实例。它负责接收 HTTP 请求,根据路由规则分发到对应的视图函数,并将响应返回给客户端。
3.2 路由(Route)
路由是将 URL 映射到 Python 函数的机制。Flask 使用 @app.route 装饰器来定义路由。路由不仅可以匹配静态路径,还可以包含动态部分。
python
@app.route('/user/<username>')
def show_user(username):
return f'User: {username}'
3.3 视图函数(View Function)
视图函数是处理请求并返回响应的函数。它可以是普通的 Python 函数,其返回值会自动转换为 HTTP 响应对象。
3.4 请求(Request)
当客户端发送请求时,Flask 会创建一个 request 对象,其中包含了请求的所有信息(如请求头、表单数据、查询参数等)。通过 from flask import request 导入后即可在视图函数中使用。
3.5 响应(Response)
视图函数的返回值可以是字符串、字典、元组或 Response 对象。Flask 会自动将其转换为一个标准的 HTTP 响应。
python
# 返回字符串
return 'Hello'
# 返回状态码
return 'Not Found', 404
# 返回字典(自动转为 JSON)
return {'key': 'value'}
4. Flask 项目结构
随着项目规模增长,良好的项目结构至关重要。这里介绍一种常见的 Flask 项目布局,即使是一个简单应用,也建议遵循这种结构,以便将来扩展。
my_flask_project/
├── app/
│ ├── __init__.py # 应用工厂
│ ├── routes.py # 路由与视图
│ ├── models.py # 数据模型
│ ├── forms.py # 表单类
│ ├── templates/ # 模板文件
│ └── static/ # 静态文件(CSS, JS, 图片)
├── config.py # 配置文件
├── run.py # 启动入口
└── requirements.txt # 依赖列表
4.1 使用应用工厂
app/__init__.py 中定义一个函数,用于创建应用实例。这样做可以方便地加载不同配置、进行测试。
python
from flask import Flask
def create_app(config_class=None):
app = Flask(__name__)
if config_class:
app.config.from_object(config_class)
# 注册路由
from app import routes
routes.init_app(app)
return app
4.2 分离路由
将路由定义放在 routes.py 中,并通过 init_app 函数注册到应用上。
python
# app/routes.py
def init_app(app):
@app.route('/')
def index():
return 'Hello from structured app!'
4.3 启动文件
run.py 作为项目启动入口:
python
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
5. Flask 路由详解
路由是 Web 应用的入口。Flask 的路由系统灵活而强大。
5.1 基本路由
python
@app.route('/')
def index():
return 'Home'
@app.route('/about')
def about():
return 'About'
5.2 动态路由
在 URL 中使用 <variable> 来捕获路径中的值。默认类型为 string。
python
@app.route('/user/<username>')
def profile(username):
return f'Hello, {username}'
Flask 支持多种转换器:
| 转换器 | 说明 |
|---|---|
string |
默认,匹配除 / 外的任意字符串 |
int |
匹配整数 |
float |
匹配浮点数 |
path |
匹配包含 / 的字符串 |
uuid |
匹配 UUID 字符串 |
python
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
5.3 HTTP 方法
路由默认只响应 GET 请求。可以通过 methods 参数指定支持的 HTTP 方法。
python
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return '处理登录'
else:
return '显示登录表单'
5.4 路由构建(URL 反向生成)
使用 url_for 函数可以根据视图函数名生成 URL,避免硬编码。
python
from flask import url_for
@app.route('/')
def index():
login_url = url_for('login') # 结果为 '/login'
return f'Login at {login_url}'
对于动态路由:
python
url_for('profile', username='alice') # 结果为 '/user/alice'
6. Flask 视图函数深入
视图函数是应用的核心逻辑所在,理解其返回值与请求处理机制十分重要。
6.1 返回 JSON 数据
在构建 API 时,常需要返回 JSON。Flask 提供了 jsonify 函数,它能自动设置正确的 Content-Type 并返回 JSON。
python
from flask import jsonify
@app.route('/api/user')
def api_user():
return jsonify({'name': 'Alice', 'age': 30})
6.2 重定向
使用 redirect 函数可以重定向到其他 URL。
python
from flask import redirect, url_for
@app.route('/old')
def old_page():
return redirect(url_for('new_page'))
6.3 中止请求
使用 abort 函数可以提前终止请求并返回指定的 HTTP 错误码。
python
from flask import abort
@app.route('/secret')
def secret():
if not user_authorized():
abort(403) # 返回 403 Forbidden
return 'Secret content'
6.4 请求对象
request 对象包含了当前请求的所有信息。常用属性:
python
from flask import request
@app.route('/submit', methods=['POST'])
def submit():
# 获取表单数据
name = request.form.get('name')
# 获取查询参数(GET 参数)
page = request.args.get('page', default=1, type=int)
# 获取 JSON 数据
data = request.get_json()
# 获取请求头
user_agent = request.headers.get('User-Agent')
return 'OK'
6.5 会话(Session)
Flask 提供了会话功能,用于在多次请求之间保存用户数据。会话数据默认存储在客户端的加密 cookie 中。
python
from flask import session
app.secret_key = 'your-secret-key' # 必须设置,用于签名
@app.route('/set')
def set_session():
session['user'] = 'alice'
return 'Session set'
@app.route('/get')
def get_session():
user = session.get('user', 'Guest')
return f'User: {user}'
总结
本篇教程我们完成了以下内容:
- 安装 Flask :使用虚拟环境隔离项目,并通过
pip安装。 - 第一个应用:创建了最简单的"Hello, World!"应用,并解析了各部分的含义。
- 基本概念:介绍了应用、路由、视图函数、请求与响应的核心概念。
- 项目结构:讲解了如何组织 Flask 项目,并介绍了应用工厂模式。
- 路由详解 :包括基本路由、动态路由、HTTP 方法、
url_for反向生成。 - 视图函数深入:涵盖了返回 JSON、重定向、请求对象、会话等常用操作。
这些知识构成了 Flask 开发的基础,下一篇教程中,我们将深入探讨 模板渲染 、表单处理 和 数据库操作,带你构建功能更完整的 Web 应用。