Flask 快速入门指南 – wiki基地


Flask 快速入门指南:从零开始构建你的第一个 Web 应用

欢迎来到 Flask 的世界!如果你正在寻找一个轻量级、灵活且易于上手的 Python Web 框架,那么 Flask 绝对是一个极好的选择。不同于一些全功能框架(如 Django),Flask 被称为“微框架”,它只提供构建 Web 应用的核心功能,不强制你使用特定的数据库、模板引擎或 ORM。这使得 Flask 非常灵活,你可以根据项目需求自由选择所需的工具和库。

这篇指南将带你一步步了解 Flask 的基础知识,包括环境搭建、创建第一个应用、使用模板、处理请求以及管理静态文件。读完这篇指南,你将能够构建一个基本的动态 Web 应用。

为什么选择 Flask?

  • 微而强大: Flask 的核心非常小巧,但通过丰富的扩展,可以轻松地添加数据库支持、用户认证、表单处理等功能。
  • 易于上手: 入门门槛低,概念清晰,非常适合初学者。
  • 灵活性高: 不强制你使用特定的技术栈,你可以自由选择适合项目的库。
  • 文档完善: Flask 官方文档非常清晰和全面。
  • 社区活跃: 庞大的用户社区意味着你在遇到问题时很容易找到帮助。

第一步:环境准备与安装

在开始之前,确保你的电脑上已经安装了 Python。推荐使用 Python 3.6 或更高版本。

1. 创建虚拟环境(强烈推荐)

在开发 Python 项目时,使用虚拟环境是一个非常好的习惯。它可以为每个项目创建一个独立的 Python 环境,避免项目之间的依赖冲突。

打开终端或命令提示符,导航到你想要创建项目的目录。然后执行以下命令(以 venv 作为虚拟环境名称为例):

“`bash

对于 Python 3.6+

python -m venv venv

如果你安装了 virtualenv (不是内置模块)

pip install virtualenv

virtualenv venv

“`

执行成功后,当前目录下会生成一个名为 venv 的文件夹。

2. 激活虚拟环境

在不同的操作系统下,激活虚拟环境的命令有所不同:

  • macOS / Linux:
    bash
    source venv/bin/activate
  • Windows (Command Prompt):
    bash
    venv\Scripts\activate.bat
  • Windows (PowerShell):
    powershell
    venv\Scripts\Activate.ps1

激活成功后,你的终端提示符前面会显示虚拟环境的名称(例如 (venv)),表明你现在正在虚拟环境中工作。

3. 安装 Flask

虚拟环境激活后,使用 pip 安装 Flask:

bash
pip install Flask

pip 会自动下载并安装 Flask 及其依赖项。安装完成后,你可以使用 pip list 命令查看当前环境中安装的所有包。

第二步:你的第一个 Flask 应用:Hello, World!

现在,我们来编写一个最简单的 Flask 应用。在你的项目目录下创建一个 Python 文件,比如 app.py,并添加以下代码:

“`python

app.py

from flask import Flask

创建 Flask 应用实例

name 是一个特殊的变量,代表当前模块的名称

Flask 使用它来定位资源(如模板和静态文件)

app = Flask(name)

定义一个路由 (URL)

当用户访问应用的根 URL (‘/’) 时,会触发下面的函数

@app.route(‘/’)
def hello_world():
# 这个函数被称为视图函数 (view function)
# 它负责处理请求并返回响应
return ‘Hello, World!’

如果这个脚本是直接运行的,则启动 Flask 开发服务器

if name == ‘main‘:
# debug=True 开启调试模式,方便开发
# 在生产环境中应该关闭调试模式
app.run(debug=True)
“`

代码解释:

  • from flask import Flask: 导入 Flask 类。
  • app = Flask(__name__): 创建一个 Flask 应用实例。__name__ 告诉 Flask 应用在哪里找到资源。
  • @app.route('/'): 这是一个装饰器。它将紧随其后的函数注册为一个视图函数,并将其关联到指定的 URL 路径(/ 表示应用的根路径)。
  • def hello_world():: 这是一个视图函数。当用户访问 / 路径时,这个函数会被执行。
  • return 'Hello, World!': 视图函数返回的值将作为响应发送给用户的浏览器。这里返回一个简单的字符串。
  • if __name__ == '__main__':: Python 的标准写法,确保只有在直接运行此脚本时才执行 app.run()
  • app.run(debug=True): 启动 Flask 的内置开发服务器。debug=True 会开启调试模式,这在开发过程中非常有用,它会在代码修改后自动重载服务器,并在发生错误时提供有用的调试信息。注意:调试模式不应在生产环境中使用,因为它可能会暴露敏感信息。

运行应用:

在终端中,确保你的虚拟环境已激活,然后在项目目录下运行 app.py 文件:

bash
python app.py

如果一切正常,你将看到类似以下的输出:

* Serving Flask app 'app' (lazy loading)
* Environment: development
* 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 端口上运行。

访问应用:

打开你的 Web 浏览器,输入地址 http://127.0.0.1:5000/http://localhost:5000/。你应该能看到页面上显示 “Hello, World!”。

恭喜你!你已经成功运行了你的第一个 Flask Web 应用。

第三步:使用模板:告别纯文本

直接在视图函数中返回 HTML 字符串非常不便,特别当 HTML 内容复杂时。Flask 使用模板引擎来解决这个问题,最常用的是 Jinja2。模板允许我们将 HTML 结构与 Python 代码分离,使页面更易于维护。

1. 创建模板文件夹

Flask 默认会在你的应用根目录下的一个名为 templates 的文件夹中查找模板文件。所以,首先在 app.py 同级目录下创建一个 templates 文件夹。

your_project/
├── venv/
├── app.py
└── templates/

2. 创建模板文件

templates 文件夹中创建一个 HTML 文件,比如 index.html

“`html







My Flask App

Hello from Template!

This content is rendered using a Jinja2 template.


“`

3. 修改视图函数渲染模板

回到 app.py,导入 render_template 函数,并修改 hello_world 视图函数来渲染 index.html

“`python

app.py

from flask import Flask, render_template # 导入 render_template

app = Flask(name)

@app.route(‘/’)
def hello_world():
# 使用 render_template 函数渲染位于 templates 文件夹下的 index.html
return render_template(‘index.html’)

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

重新运行 python app.py(如果之前没有停止),然后访问 http://127.0.0.1:5000/。现在你应该看到 index.html 中的内容了。

4. 向模板传递数据

模板不仅仅是静态 HTML,它还可以显示动态数据。你可以通过 render_template 函数向模板传递变量。

修改 app.py 如下:

“`python

app.py

from flask import Flask, render_template

app = Flask(name)

@app.route(‘/’)
def hello_world():
# 定义一些变量
page_title = “Home Page”
greeting = “Welcome to My Flask App!”
items = [“Apple”, “Banana”, “Cherry”]

# 将变量通过关键字参数传递给模板
return render_template('index.html',
                       title=page_title,
                       message=greeting,
                       my_list=items)

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

“`

修改 templates/index.html,使用 Jinja2 语法来显示传递过来的数据:

“`html







{{ title }} – My Flask App

{{ message }}

Items:

    {# 使用 Jinja2 的 for 循环遍历列表 #}
    {% for item in my_list %}

  • {{ item }}
  • {% endfor %}

{# 使用 Jinja2 的条件判断 #}
{% if my_list|length > 2 %}

That’s a good number of items!

{% else %}

Let’s add more items!

{% endif %}


“`

Jinja2 语法简介:

  • {{ variable }}: 用于输出变量的值。
  • {% statement %}: 用于执行控制结构,如 for 循环、if 条件判断等。
  • {# comment #}: 用于添加模板注释。
  • | filter: 用于对变量应用过滤器,例如 |length 获取列表长度。

保存文件,重新运行 app.py,然后刷新浏览器。你应该能看到传递的数据在页面上正确显示,包括标题、消息以及列表的迭代。

第四步:处理用户输入:请求与表单

Web 应用通常需要接收用户的输入,例如通过 URL 参数或 HTML 表单。Flask 提供了 request 对象来访问这些数据。

1. 处理 URL 参数(GET 请求)

用户可以通过 URL 传递参数,例如 http://127.0.0.1:5000/greet?name=Alice。这些参数可以通过 request.args 获取。

修改 app.py,添加一个新的路由:

“`python

app.py

from flask import Flask, render_template, request # 导入 request

app = Flask(name)

… 其他路由 …

添加一个带参数的路由

@app.route(‘/greet’)
def greet_user():
# 从 URL 参数中获取 ‘name’,如果没有提供则默认为 ‘Guest’
user_name = request.args.get(‘name’, ‘Guest’)
return render_template(‘greet.html’, name=user_name)

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

创建一个新的模板文件 templates/greet.html

“`html







Greeting

Hello, {{ name }}!

This message is personalized based on the URL parameter.

Go back home


“`

重新运行应用。访问 http://127.0.0.1:5000/greet,你应该看到 “Hello, Guest!”。访问 http://127.0.0.1:5000/greet?name=Bob,你应该看到 “Hello, Bob!”。

request.args 是一个类似于字典的对象,包含了所有 URL 参数。.get() 方法是获取参数的安全方式,它允许你指定一个默认值,以防参数不存在,避免 KeyError。

2. 处理表单数据(POST 请求)

当用户提交 HTML 表单时,数据通常通过 POST 方法发送到服务器。这些数据可以通过 request.form 获取。

我们创建一个简单的表单页面和一个处理表单提交的路由。

修改 app.py,添加路由和视图函数:

“`python

app.py

from flask import Flask, render_template, request, redirect, url_for # 导入 redirect 和 url_for

app = Flask(name)

… 其他路由 …

GET 请求用于显示表单

@app.route(‘/form’, methods=[‘GET’, ‘POST’])
def handle_form():
if request.method == ‘POST’:
# 处理 POST 请求
user_input = request.form.get(‘user_input’) # 获取表单字段名为 ‘user_input’ 的值
if user_input:
# 如果输入不为空,重定向到带有参数的 greet 页面
# url_for() 用于生成 URL,避免硬编码,name 是目标函数名
return redirect(url_for(‘greet_user’, name=user_input))
else:
# 如果输入为空,可以在这里处理错误,或者重新渲染表单并显示消息
return render_template(‘form.html’, error=”Input cannot be empty!”)
else:
# 处理 GET 请求,显示表单
return render_template(‘form.html’)

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

“`

创建一个新的模板文件 templates/form.html

“`html







Simple Form

Enter Your Name

{# 如果有错误消息,显示它 #}
{% if error %}

{{ error }}

{% endif %}

{# form 标签的 action 指向处理表单提交的 URL,method 设置为 POST #}


{# name 属性与 request.form.get() 中的键对应 #}

Go back home


“`

代码解释:

  • @app.route('/form', methods=['GET', 'POST']): 这个路由现在可以响应 GET 和 POST 两种请求。GET 用于显示表单,POST 用于处理表单提交。
  • if request.method == 'POST':: 检查请求方法是否为 POST。
  • request.form.get('user_input'): 获取表单中 name="user_input" 的输入字段的值。同样使用 .get() 方法是安全的。
  • redirect(url_for('greet_user', name=user_input)): redirect 函数用于重定向用户到另一个 URL。url_for() 函数根据视图函数名 (greet_user) 及其参数来动态生成 URL,这比直接写 /greet?name=... 更灵活和健壮。
  • form.html 中,<form action="{{ url_for('handle_form') }}" method="post"> 中的 action 属性使用了 url_for 指向了处理表单提交的视图函数 (handle_form),并设置 method="post"<input> 标签的 name 属性 (user_input) 是在 request.form.get() 中用来获取值的键。

重新运行应用。访问 http://127.0.0.1:5000/form,填写名字并提交。你应该会被重定向到 /greet 页面,显示你输入的名字。

第五步:静态文件:让你的应用更漂亮

Web 应用通常需要引入 CSS、JavaScript 或图片等静态文件。Flask 默认会在你的应用根目录下的一个名为 static 的文件夹中查找静态文件。

1. 创建静态文件文件夹

app.pytemplates 文件夹同级目录下创建一个 static 文件夹。

your_project/
├── venv/
├── app.py
├── templates/
└── static/
└── style.css

2. 创建静态文件

static 文件夹中创建一个 CSS 文件,比如 style.css

“`css
/ static/style.css /
body {
font-family: sans-serif;
margin: 20px;
background-color: #f0f0f0;
}

h1 {
color: #333;
}

p {
color: #666;
}
“`

3. 在模板中引用静态文件

在你的模板文件(例如 templates/index.html)中,使用 url_for() 函数来引用静态文件:

“`html







{{ title }} – My Flask App
{# 使用 url_for() 引用 static 文件夹中的 style.css #}

{{ message }}



“`

代码解释:

{{ url_for('static', filename='style.css') }} 会生成访问 static/style.css 文件的 URL。url_for() 的第一个参数 'static' 是 Flask 为静态文件提供的端点名称,filename 参数是相对于 static 文件夹的路径。

保存文件,重新运行应用,刷新 http://127.0.0.1:5000/ 页面。你会看到页面应用了 style.css 中的样式。

同样的方式,你可以在 static 文件夹中创建子文件夹(例如 static/images/logo.png),然后在模板中使用 {{ url_for('static', filename='images/logo.png') }} 来引用。

第六步:应用结构与进阶方向

随着应用变得复杂,将所有代码放在一个 app.py 文件中会变得难以管理。虽然对于小型应用这没问题,但大型应用通常需要更好的组织结构。

1. 简单的文件组织

对于稍大的应用,你可以考虑这样的结构:

your_project/
├── venv/
├── app.py # 应用入口,导入并注册其他模块
├── config.py # 配置信息
├── views/ # 存放视图函数的文件夹
│ ├── __init__.py
│ └── user.py # 用户相关的视图
│ └── post.py # 帖子相关的视图
├── templates/ # 模板文件
└── static/ # 静态文件

然后你可以使用 蓝图 (Blueprints) 来组织不同的功能模块(如用户、文章、订单等)。蓝图可以将路由、视图函数、模板和静态文件组织在一起,然后注册到主应用上。这是构建大型 Flask 应用的推荐方式。

2. 进阶学习方向

掌握了上述基础后,你可以继续深入学习 Flask 的更多功能和常用扩展:

  • 蓝图 (Blueprints): 用于组织大型应用结构。
  • 数据库集成: 使用 ORM 库如 SQLAlchemy (Flask-SQLAlchemy 扩展) 或 Peewee 来与数据库交互。
  • 表单处理与验证: 使用 Flask-WTF 扩展简化表单创建、渲染和验证。
  • 用户认证与授权: 使用 Flask-Login、Flask-Security 等扩展实现用户注册、登录、会话管理和权限控制。
  • RESTful API: 构建 API 服务,可以使用 Flask-RESTful 或 Flask-RESTx 等扩展。
  • 单元测试: 为你的 Flask 应用编写自动化测试。
  • 部署: 了解如何将 Flask 应用部署到生产服务器上,通常需要使用 WSGI 服务器 (如 Gunicorn, uWSGI) 和反向代理 (如 Nginx, Apache)。
  • 配置管理: 如何使用配置文件或环境变量管理应用配置。
  • 日志记录: 如何在应用中添加日志功能。

总结

这篇指南带你快速浏览了 Flask 的核心概念:

  • 环境搭建与安装。
  • 创建一个基本的 Flask 应用和路由。
  • 使用 Jinja2 模板渲染动态内容。
  • 处理 GET 和 POST 请求,获取 URL 参数和表单数据。
  • 管理和引用静态文件。

Flask 的强大之处在于它的简洁和可扩展性。通过这些基础知识,你已经迈出了构建自己 Web 应用的第一步。接下来,最好的学习方式是动手实践,尝试构建更复杂的应用,并探索 Flask 的各种扩展。

记住,官方文档永远是最好的参考资料。祝你在 Flask 的世界里探索愉快!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部