Flask 中文教程:零基础入门到进阶

Flask 中文教程:零基础入门到进阶

Flask 是一个轻量级的 Python Web 框架,以其灵活性和易用性而闻名。它被称为“微框架”,因为它只提供了 Web 开发的核心组件,而将其他功能(如数据库集成、表单验证等)留给第三方扩展。这使得 Flask 非常适合构建各种规模的 Web 应用,从简单的个人博客到复杂的企业级系统。

本教程将带你从零开始学习 Flask,逐步掌握其核心概念和高级特性。无论你是否有 Web 开发经验,都可以通过本教程快速上手 Flask。

一、准备工作:安装与环境配置

在开始编写 Flask 应用之前,我们需要先安装 Flask 并配置好开发环境。

1.1 安装 Python

Flask 是基于 Python 的,所以首先确保你的计算机上已经安装了 Python。推荐使用 Python 3.6 或更高版本。你可以从 Python 官网下载并安装适合你操作系统的 Python 版本。

安装完成后,在命令行中输入以下命令验证 Python 是否安装成功:

bash
python --version

如果显示 Python 版本号,则表示安装成功。

1.2 创建虚拟环境(推荐)

为了避免不同项目之间的依赖冲突,强烈建议使用虚拟环境来隔离每个项目的依赖。

我们可以使用 Python 内置的 venv 模块来创建虚拟环境:

```bash

创建虚拟环境,名为 myenv(你可以自定义名称)

python3 -m venv myenv

激活虚拟环境

Windows:

myenv\Scripts\activate

macOS/Linux:

source myenv/bin/activate
```

激活虚拟环境后,命令行提示符前会显示虚拟环境的名称(如 (myenv))。

1.3 安装 Flask

在虚拟环境激活的情况下,使用 pip 命令安装 Flask:

bash
pip install flask

安装完成后,我们可以通过以下 Python 代码验证 Flask 是否安装成功:

python
import flask
print(flask.__version__)

如果显示 Flask 版本号,则表示安装成功。

二、Flask 基础:第一个应用

让我们从一个最简单的 Flask 应用开始,了解 Flask 的基本结构和工作原理。

2.1 创建应用文件

创建一个名为 app.py 的 Python 文件,并写入以下代码:

```python
from flask import Flask

创建 Flask 应用实例

app = Flask(name)

定义路由和视图函数

@app.route('/')
def hello_world():
return 'Hello, World!'

运行应用

if name == 'main':
app.run(debug=True)
```

2.2 代码解析

  • from flask import Flask: 导入 Flask 类。
  • app = Flask(__name__): 创建 Flask 应用实例。__name__ 是一个特殊的 Python 变量,表示当前模块的名称。
  • @app.route('/'): 这是一个装饰器,它将 URL 路径 /(根路径)与下面的 hello_world 函数关联起来。
  • def hello_world():: 这是视图函数,它处理对根路径的请求,并返回一个字符串 "Hello, World!"。
  • if __name__ == '__main__':: 这是一个条件判断,确保只有当直接运行 app.py 文件时,才会执行 app.run()
  • app.run(debug=True): 启动 Flask 内置的开发服务器。debug=True 开启调试模式,当代码发生变化时,服务器会自动重新加载,方便开发调试。

2.3 运行应用

在命令行中,进入 app.py 文件所在的目录,然后运行以下命令:

bash
python app.py

你将看到类似以下的输出:

* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: xxx-xxx-xxx

这表示 Flask 应用已经在本地的 5000 端口上运行了。打开浏览器,访问 http://127.0.0.1:5000/,你将看到 "Hello, World!"。

恭喜你,你已经成功创建并运行了第一个 Flask 应用!

三、路由与视图函数

路由是 Flask 应用的核心,它定义了 URL 路径与处理请求的视图函数之间的映射关系。

3.1 基本路由

在上面的例子中,我们已经看到了一个简单的路由:

python
@app.route('/')
def hello_world():
return 'Hello, World!'

这表示当用户访问根路径 / 时,Flask 会调用 hello_world 函数来处理请求,并返回 "Hello, World!" 作为响应。

3.2 动态路由

我们可以使用尖括号 <> 来定义动态路由,从 URL 中提取参数:

python
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'

在这个例子中,username 是一个变量,它会从 URL 中提取。例如,当用户访问 /user/john 时,username 的值将是 "john",视图函数将返回 "User john"。

我们还可以指定变量的类型:

python
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'

这里,post_id 被指定为整数类型 (int)。如果用户访问的 URL 中的 post_id 不是整数,Flask 会返回 404 错误。

支持的类型转换器:

类型 说明
string (默认)接受任何不包含斜杠的文本
int 接受整数
float 接受浮点数
path 类似于 string,但可以包含斜杠
uuid 接受 UUID 字符串
any 可以是定义的几个中的任何一个

3.3 HTTP 方法

默认情况下,路由只响应 GET 请求。我们可以使用 methods 参数来指定允许的 HTTP 方法:

python
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 处理 POST 请求(如验证用户名和密码)
return 'Logged in successfully!'
else:
# 处理 GET 请求(如显示登录表单)
return 'Please log in'

在这个例子中,login 视图函数可以处理 GET 和 POST 请求。我们可以使用 flask.request 对象来获取请求的信息,如请求方法、表单数据等。

四、模板渲染

在实际应用中,我们通常需要返回更复杂的 HTML 页面,而不是简单的字符串。Flask 使用 Jinja2 模板引擎来渲染 HTML 模板。

4.1 创建模板文件

在你的项目目录下创建一个名为 templates 的文件夹。在 templates 文件夹中创建一个名为 index.html 的文件,并写入以下 HTML 代码:

```html




My Flask App

Hello, {{ name }}!


```

4.2 渲染模板

修改 app.py 文件中的视图函数,使用 render_template 函数来渲染模板:

```python
from flask import Flask, render_template

app = Flask(name)

@app.route('/')
@app.route('/') # 同时适用根目录和 /
def index(name=None):
if name is None:
name = "Guest" # 默认名字是Guest
return render_template('index.html', name=name)

if name == 'main':
app.run(debug=True)
```

  • from flask import render_template: 导入 render_template 函数。
  • render_template('index.html', name=name): 渲染 index.html 模板,并将 name 变量传递给模板。

在模板中,我们使用 {{ name }} 来插入 name 变量的值。

4.3 模板继承

模板继承可以帮助我们创建可重用的模板结构。例如,我们可以创建一个基础模板 base.html,包含网站的公共部分(如页眉、页脚等):

```html





{% block title %}{% endblock %}



{% block content %}{% endblock %}



```

然后,我们可以在其他模板中继承 base.html,并填充特定的内容:

```html

{% extends "base.html" %}

{% block title %}Home{% endblock %}

{% block content %}

Hello, {{ name }}!

{% endblock %}
```

五、静态文件

Web 应用通常需要提供静态文件,如 CSS、JavaScript、图片等。

5.1 创建静态文件夹

在你的项目目录下创建一个名为 static 的文件夹。将你的静态文件放入 static 文件夹中。

5.2 引用静态文件

在模板中,可以使用 url_for 函数来生成静态文件的 URL:

```html

```

Flask 会自动将 static 文件夹映射到 /static 路径。例如,style.css 文件的 URL 将是 /static/style.css

六、表单处理

Flask 可以轻松处理 HTML 表单。

6.1 创建表单

templates 文件夹中创建一个名为 form.html 的文件,并写入以下 HTML 代码:

```html




```

6.2 处理表单数据

app.py 文件中,创建一个新的路由和视图函数来处理表单提交:

```python
from flask import request

@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
name = request.form['name']
return f'Hello, {name}!'
else:
return render_template('form.html')
```

  • request.form['name']: 获取表单中 name 字段的值。

七、数据库集成

Flask 本身不提供数据库支持,但它可以与各种数据库(如 SQLite、PostgreSQL、MySQL 等)轻松集成。常用的 Flask 数据库扩展有:

  • Flask-SQLAlchemy: 一个强大的 ORM(对象关系映射)工具,简化了数据库操作。
  • Flask-MongoEngine: 用于连接 MongoDB 数据库。

7.1 安装 Flask-SQLAlchemy

bash
pip install flask-sqlalchemy

7.2 配置数据库

app.py 文件中,配置数据库连接:

```python
from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' # 使用 SQLite 数据库
db = SQLAlchemy(app)
```

7.3 定义模型

```python
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}>'

```

7.4 创建数据库表

```python

在 Python shell 中执行

from app import db
db.create_all()
```

7.5 执行数据库操作

```python

添加用户

from app import User,db
admin = User(username='admin', email='[email protected]')
guest = User(username='guest', email='[email protected]')
db.session.add(admin)
db.session.add(guest)
db.session.commit()

查询用户

users = User.query.all()
print(users)

[, ]

admin = User.query.filter_by(username='admin').first()
print (admin)

```

八、Flask 扩展

Flask 的强大之处在于其丰富的扩展生态系统。除了 Flask-SQLAlchemy,还有许多其他有用的扩展:

  • Flask-WTF: 表单验证和渲染。
  • Flask-Login: 用户认证和会话管理。
  • Flask-Mail: 发送电子邮件。
  • Flask-RESTful: 构建 RESTful API。
  • Flask-Admin:快速构建后台管理界面
  • Flask-Migrate: 数据库迁移

你可以根据你的项目需求选择合适的扩展。

九、部署

当你完成 Flask 应用的开发后,你需要将其部署到服务器上,以便用户可以访问。

9.1 开发服务器 vs 生产服务器

Flask 内置的开发服务器(app.run()) 仅适用于开发环境,不适合用于生产环境。在生产环境中,你应该使用专业的 WSGI 服务器,如 Gunicorn 或 uWSGI。

9.2 使用 Gunicorn 部署

  1. 安装 Gunicorn:

    bash
    pip install gunicorn

  2. 运行 Gunicorn:

    bash
    gunicorn app:app

    这将启动 Gunicorn 服务器,并将你的 Flask 应用(app.py 文件中的 app 实例)作为 WSGI 应用运行。

9.3 使用 Nginx 或 Apache 作为反向代理

在生产环境中,通常会在 Gunicorn 或 uWSGI 前面使用 Nginx 或 Apache 作为反向代理服务器。反向代理可以提供以下优势:

  • 负载均衡: 将请求分发到多个应用服务器。
  • 静态文件服务: 直接提供静态文件,减轻应用服务器的负担。
  • SSL 加密: 处理 HTTPS 连接。
  • 安全: 保护应用服务器免受直接攻击。

十、进阶主题

10.1 蓝图(Blueprints)

当你的应用变得越来越大时,使用蓝图可以帮助你组织代码,将应用分解成多个模块。

10.2 RESTful API

Flask 可以轻松构建 RESTful API,为你的前端应用或其他服务提供数据接口。

10.3 测试

编写测试可以确保你的应用在各种情况下都能正常工作。Flask 提供了测试工具,方便你编写单元测试和集成测试。

10.4 异步任务

对于耗时的任务(如发送电子邮件、处理大量数据等),可以使用 Celery 等工具来执行异步任务,避免阻塞主线程。

总结

本教程介绍了 Flask 的基础知识和一些进阶主题,希望能帮助你快速入门 Flask Web 开发。Flask 是一个灵活而强大的框架,你可以根据自己的需求进行定制和扩展。

要深入学习 Flask,建议阅读 Flask 官方文档,并参考一些优秀的 Flask 项目。祝你在 Flask Web 开发之旅中取得成功!

THE END