目录
一、Flask 是什么?为何选择它?
Flask 是基于 Python 的轻量级 Web 应用框架,诞生于 2010 年,其核心依赖 Werkzeug WSGI 工具包和 Jinja2 模板引擎 。它就像是一个小巧灵活的工具箱,仅提供了 Web 开发所需的核心功能,如简单的路由系统、请求处理和模板渲染等。这种轻量级的设计使得 Flask 非常适合快速搭建小型 Web 应用或进行项目原型开发。
与其他 Python Web 框架相比,Flask 的独特魅力在于它的轻量与灵活。以 Django 为例,Django 是一个功能强大的全栈框架,内置了用户认证、数据库抽象层、表单验证、管理后台等丰富的功能,遵循 “约定优于配置” 的原则,能帮助开发者快速构建功能完备的大型 Web 应用。然而,这种 “大而全” 的特性也使得 Django 相对臃肿,对于一些小型项目或对灵活性要求较高的场景来说,可能会显得过于繁琐,开发者在使用时可能会被框架的预设架构束缚。
而 Flask 则截然不同,它没有过多的内置功能和强制的项目结构,开发者可以根据项目的具体需求自由选择和集成各种扩展和工具。比如,在数据库操作方面,你可以选择 SQLAlchemy 扩展来实现对象关系映射(ORM);在表单处理上,Flask - WTF 扩展能帮助你轻松实现表单验证等功能。这种高度的灵活性让 Flask 在面对各种不同类型和规模的项目时,都能游刃有余,无论是小型的个人博客、简单的 API 服务,还是作为大型复杂项目的基础框架,Flask 都能发挥出其独特的优势。
二、环境搭建:开启 Flask 之旅
在开始使用 Flask 开发 Web 应用之前,我们需要先搭建好开发环境。这包括安装 Python、创建虚拟环境以及安装 Flask。下面将详细介绍在不同操作系统下的搭建步骤。
2.1 安装 Python
Flask 是基于 Python 开发的,所以首先需要安装 Python。建议安装 Python 3.6 及以上版本,因为新版本通常会带来性能优化和新特性,同时也能更好地兼容 Flask 及相关扩展。
- Windows 系统:
从 Python 官方网站(https://www.python.org/downloads/windows/ )下载适合你系统的 Python 安装包(例如,Windows x86-64 executable installer 对于 64 位系统)。下载完成后,双击运行安装程序,在安装过程中,务必勾选 “Add Python to PATH” 选项,这样才能在命令行中直接运行 Python。安装完成后,按下 Win+R 键,打开运行窗口,输入 “cmd” 打开命令行界面,输入 “python -V”(注意有空格),如果看到版本号显示出来(如 Python 3.10.0),则说明 Python 已经成功安装。
- macOS 系统:
可以通过 Homebrew 或直接从 Python 官网下载安装包。如果未安装 Homebrew,通过终端运行以下命令安装:/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 。安装好 Homebrew 后,使用brew install python命令安装 Python 3。也可以访问 Python 官网下载对应 macOS 版本的安装包,双击下载的 pkg 文件,跟随安装向导完成安装。安装完成后,打开终端,输入 “python3 --version” 验证 Python 是否安装成功及其版本。
- Linux 系统:
大多数 Linux 发行版的软件库中都包含了 Python。使用包管理器安装是最便捷的方式。例如,Ubuntu/Debian 系统使用以下命令安装:
sudo apt-get update
sudo apt-get install python3
Fedora 系统使用:
sudo dnf install python3
Arch Linux 系统使用:
sudo pacman -Syu python
安装完成后,在终端输入 “python3 --version” 验证安装结果。
2.2 创建虚拟环境
虚拟环境是一种工具,它允许你为不同的项目创建隔离的 Python 运行环境,这样可以避免不同项目之间的依赖包冲突。例如,项目 A 可能依赖 Flask 1.1.2 版本,而项目 B 需要 Flask 2.0.1 版本,使用虚拟环境就可以让这两个项目各自使用自己需要的 Flask 版本,互不干扰。
Python 3.3 及以上版本内置了venv模块用于创建虚拟环境。以创建一个名为myenv的虚拟环境为例,在命令行中执行以下步骤:
- 打开命令行工具(在 Windows 上是 CMD 或 PowerShell,在 macOS 或 Linux 上是 Terminal)。
- 导航到你想要创建虚拟环境的目录。例如,如果你想在当前用户的文档目录下创建虚拟环境,可以使用cd命令切换到该目录,如cd ~/Documents 。
- 运行创建虚拟环境的命令:python -m venv myenv 。这里的myenv是你为虚拟环境指定的名称,你可以根据实际情况修改。
创建好虚拟环境后,需要激活它才能使用。激活虚拟环境的方式因操作系统而异:
- Windows 系统:
在命令行中进入虚拟环境的 Scripts 目录,然后执行activate命令。例如,如果你的虚拟环境名为myenv,则执行myenv\Scripts\activate 。激活后,命令行提示符会显示虚拟环境的名称,如(myenv) C:\Users\YourUsername\Documents> ,表示你现在在该虚拟环境中工作。
- macOS 和 Linux 系统:
在命令行中执行source myenv/bin/activate 。激活后,命令行提示符同样会显示虚拟环境的名称,如(myenv) yourusername@yourcomputer:~$ 。
2.3 安装 Flask
激活虚拟环境后,就可以使用 Python 的包管理器pip来安装 Flask 了。在命令行中输入以下命令:
pip install Flask
pip会自动从 Python Package Index(PyPI)下载并安装 Flask 及其依赖项,如itsdangerous、Jinja2、blinker、Werkzeug、click、importlib - metadata等。安装过程中,pip会显示安装进度和相关信息。安装完成后,可以通过以下命令验证 Flask 是否安装成功:
pip show Flask
如果安装成功,会显示 Flask 的相关信息,包括名称、版本、摘要、主页、作者、作者邮箱、许可证、安装位置以及依赖项等,类似如下:
Name: Flask
Version: 3.0.3
Summary: A simple framework for building complex web applications.
Home-page:
Author:
Author-email:
License:
Location: /Users/RUNOOB/.pyenv/versions/3.9.7/lib/python3.9/site-packages
Requires: itsdangerous, Jinja2, blinker, Werkzeug, click, importlib-metadata
Required-by:
至此,我们已经成功搭建好了 Flask 的开发环境,接下来就可以正式开始 Flask 的学习和实践了。
三、第一个 Flask 应用:Hello, Flask!
现在我们已经搭建好了开发环境,接下来就动手创建我们的第一个 Flask 应用吧!这个应用非常简单,当用户访问特定的 URL 时,它会返回 “Hello, Flask!” 的消息。
在你喜欢的代码编辑器中,创建一个新的 Python 文件,命名为app.py(当然,你也可以使用其他名称,但app.py是 Flask 项目的常见命名)。然后,在文件中输入以下代码:
from flask import Flask
# 创建Flask应用实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/')
def hello():
return 'Hello, Flask!'
if __name__ == '__main__':
app.run(debug=True)
让我们逐行分析这段代码:
- 导入 Flask 模块:from flask import Flask,这行代码从flask库中导入Flask类。Flask类是 Flask 框架的核心,我们通过实例化这个类来创建我们的 Web 应用。
- 创建 Flask 应用实例:app = Flask(__name__) ,这里使用Flask类创建了一个名为app的应用实例。__name__是 Python 的内置变量,它代表当前模块的名称。在这个例子中,__name__的值是'__main__' ,因为我们是直接运行这个脚本。Flask 应用实例需要知道它所在的模块,以便正确地加载资源和配置。
- 定义路由和视图函数:
-
- @app.route('/')是一个装饰器,它定义了一个路由规则。'/'表示根 URL,当用户访问应用的根 URL(例如http://127.0.0.1:5000/ )时,会触发下面的函数。
-
- def hello():定义了一个视图函数,视图函数负责处理用户的请求并返回响应。在这个例子中,hello函数返回字符串'Hello, Flask!' ,当用户访问根 URL 时,这个字符串就会作为响应内容返回给用户。
- 运行应用:
-
- if __name__ == '__main__': 这是 Python 的惯用法,它确保只有在直接运行这个脚本时,才会执行下面的代码,而当这个脚本被作为模块导入到其他脚本中时,不会执行。
-
- app.run(debug=True) 启动 Flask 开发服务器,debug=True表示开启调试模式。在调试模式下,Flask 会提供详细的错误信息,并且当代码发生变化时,服务器会自动重新加载,方便我们开发和调试。
保存app.py文件,然后在命令行中进入到该文件所在的目录(确保你的虚拟环境已经激活),输入以下命令运行应用:
python app.py
运行成功后,你会看到类似如下的输出:
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 123-456-789
这表明你的 Flask 应用已经在http://127.0.0.1:5000地址上运行起来了,并且处于调试模式。打开你的浏览器,访问http://127.0.0.1:5000 ,你应该能看到页面上显示 “Hello, Flask!”。恭喜你,你已经成功创建并运行了你的第一个 Flask 应用!
四、深入理解 Flask 核心概念
4.1 应用对象
在 Flask 中,Flask类的实例就是我们的应用对象,它代表整个 Web 应用。如我们在第一个 Flask 应用中创建的app = Flask(__name__) ,这里的app就是应用对象。它负责管理整个应用的配置、路由、请求处理等核心功能。应用对象是 Flask 应用的入口点,所有的请求都会通过它来进行分发和处理 。它还提供了一系列方法和属性,方便我们对应用进行定制和扩展。例如,app.run()方法用于启动 Flask 开发服务器,app.config属性用于配置应用的各种参数,如密钥、数据库连接字符串等。
4.2 路由系统
路由系统是 Flask 的核心功能之一,它负责将不同的 URL 映射到对应的视图函数上,使得应用能够根据用户请求的 URL 来执行相应的代码逻辑 。在 Flask 中,使用@app.route装饰器来定义路由。例如:
@app.route('/')
def index():
return 'This is the index page'
@app.route('/about')
def about():
return 'This is the about page'
在上述代码中,@app.route('/')将根 URL 映射到index函数,当用户访问http://127.0.0.1:5000/时,会执行index函数并返回相应的内容;@app.route('/about')将/about URL 映射到about函数,当用户访问http://127.0.0.1:5000/about时,会执行about函数。
除了静态路由,Flask 还支持动态路由,即 URL 中可以包含参数。动态路由的参数使用<参数名>的形式定义,视图函数中可以接收这些参数。例如,要创建一个显示用户个人信息的页面,每个用户有不同的 ID,我们可以这样定义动态路由:
@app.route('/user/<int:user_id>')
def user_profile(user_id):
return f'This is the profile page of user {user_id}'
这里的<int:user_id>表示这是一个动态参数,类型为整数,参数名为user_id。当用户访问http://127.0.0.1:5000/user/1时,user_id的值为 1,视图函数user_profile会接收到这个值并返回相应的内容。如果访问http://127.0.0.1:5000/user/abc ,由于abc不是整数,Flask 会返回 404 错误,因为它无法匹配到对应的路由。
Flask 支持的动态路由参数类型除了int(整数),还有string(字符串,默认类型,可不写类型声明)、float(浮点数)、path(路径,可包含斜杠)等。例如:
@app.route('/item/<string:item_name>')
def show_item(item_name):
return f'This is the item: {item_name}'
@app.route('/price/<float:price>')