从零开始学习 Python Flask 微框架:构建你的第一个 Web 应用
Python 作为一种强大且易于学习的编程语言,在 Web 开发领域也占据着重要地位。在众多 Python Web 框架中,Flask 以其轻量、灵活的特性,成为了许多开发者构建 Web 应用的首选,尤其是对于小型项目、API 服务或快速原型开发。
如果你是 Web 开发的初学者,或者想了解如何使用 Python 构建 Web 应用,那么学习 Flask 是一个非常棒的起点。本文将带你从零开始,一步步深入了解 Flask 的核心概念和基本用法,帮助你构建你的第一个 Flask 应用。
我们将涵盖以下内容:
- 什么是 Flask?为什么选择它?
- 准备工作:Python 环境和虚拟环境
- 安装 Flask
- 你的第一个 Flask 应用:”Hello, World!”
- 运行 Flask 应用
- 理解 Flask 的核心概念:路由与视图函数
- 使用 HTML 模板:分离逻辑与呈现
- 向模板传递数据
- 处理动态路由与 URL 参数
- 处理 HTTP 方法:GET 与 POST
- 获取请求数据:表单与查询参数
- 重定向与错误处理
- 项目结构初探
- Flask 扩展简介
- 下一步:进阶学习方向
好了,废话不多说,让我们开始 Flask 的学习之旅吧!
1. 什么是 Flask?为什么选择它?
Flask 是一个用 Python 编写的微型 Web 框架。
- 微型 (Micro): 这并不意味着 Flask 功能少,而是指 Flask 的核心非常简单,它只保留了 Web 开发最核心的功能:请求处理和路由。它不强制你使用特定的数据库、模板引擎或其他组件。你可以根据自己的需求选择或集成各种工具。
- 灵活 (Flexible): 正因为其微型的特性,Flask 提供了极大的灵活性。你可以自由选择适合项目的数据库(如 SQLAlchemy、MongoDB)、表单验证库(如 Flask-WTF)、用户认证方案等。
- 易于上手 (Easy to Start): Flask 的 API 设计简洁直观,非常适合新手入门。只需几行代码,你就能运行一个功能简单的 Web 应用。
- 可扩展 (Extensible): Flask 拥有一个活跃的社区,提供了大量的 Flask 扩展,可以轻松地为你的应用添加各种功能,如用户认证、数据库集成、RESTful API 构建等。
选择 Flask 的原因可能包括:
- 你需要一个轻量级的框架来快速构建小型应用或 API 服务。
- 你希望对框架的各个组件有更多的控制权,不喜欢被框架强制规定技术栈。
- 你已经是 Python 开发者,希望用熟悉的语言进行 Web 开发。
- 你是一个 Web 开发新手,想从一个相对简单、概念清晰的框架开始。
2. 准备工作:Python 环境和虚拟环境
在开始学习 Flask 之前,你需要确保你的计算机上安装了 Python 3。你可以访问 Python 官方网站 下载并安装最新版本。
此外,强烈建议你在开发 Python 项目时使用虚拟环境 (Virtual Environment)。虚拟环境可以为每个项目创建一个独立的 Python 环境,使得项目之间安装的库互不影响。这能有效避免库版本冲突的问题。
Python 3.3+ 内置了 venv
模块,可以方便地创建虚拟环境。
步骤:
- 打开终端或命令提示符。
- 进入你打算存放项目代码的目录。
- 创建虚拟环境:
- 在 macOS 或 Linux 上:
bash
python3 -m venv venv - 在 Windows 上:
bash
python -m venv venv
这会在当前目录下创建一个名为venv
的文件夹,其中包含一个独立的 Python 环境。
- 在 macOS 或 Linux 上:
- 激活虚拟环境:
- 在 macOS 或 Linux 上:
bash
source venv/bin/activate - 在 Windows 上:
bash
.\venv\Scripts\activate
激活成功后,你会看到终端提示符前面多了(venv)
字样,表示你当前处于虚拟环境中。
- 在 macOS 或 Linux 上:
当你完成项目开发或切换到其他项目时,可以使用 deactivate
命令退出当前虚拟环境。
重要提示: 激活虚拟环境后,所有通过 pip
安装的库都将安装到这个虚拟环境中,而不会影响系统全局的 Python 环境。这是良好的开发习惯!
3. 安装 Flask
激活虚拟环境后,安装 Flask 就非常简单了。只需要使用 pip 命令:
bash
pip install Flask
pip 会自动下载并安装 Flask 及其依赖项。
你可以通过运行以下命令来验证 Flask 是否安装成功:
bash
pip list
在输出的列表中,你应该能看到 Flask 以及它的依赖项(如 Jinja2、Werkzeug 等)。
4. 你的第一个 Flask 应用:”Hello, World!”
现在,让我们来编写一个最简单的 Flask 应用。
在你的项目目录下,创建一个新的 Python 文件,比如命名为 app.py
。用你喜欢的代码编辑器打开它,然后输入以下代码:
“`python
导入 Flask 类
from flask import Flask
创建一个 Flask 应用实例
name 是 Python 模块的内置变量,它会根据模块的使用方式(作为主程序运行或被导入)
被赋予不同的值。Flask 用它来确定应用所在的根目录,以便找到静态文件和模板文件等。
app = Flask(name)
使用装饰器定义一个路由,将 URL “/” 映射到下面的函数
@app.route(‘/’)
def hello_world():
“””
定义处理根 URL 的视图函数
当用户访问应用的根 URL (例如 http://127.0.0.1:5000/) 时,会触发此函数
“””
return ‘Hello, World!’ # 返回一个字符串作为响应体
判断是否作为主程序运行
if name == ‘main‘:
# 运行 Flask 应用
# debug=True 模式在开发阶段非常有用,它会在代码修改时自动重新加载应用,
# 并在发生错误时提供一个交互式调试器。但在生产环境中,请务必关闭 debug 模式!
app.run(debug=True)
“`
代码解释:
from flask import Flask
: 从flask
库中导入Flask
类。app = Flask(__name__)
: 创建一个Flask
应用实例。__name__
参数帮助 Flask 找到资源(如模板文件)。@app.route('/')
: 这是一个装饰器。装饰器是 Python 的一个高级特性,它可以修改或增强函数的功能。在这里,@app.route('/')
告诉 Flask,当用户访问应用的根 URL(即/
)时,调用紧随其后的hello_world
函数。这个过程被称为路由 (Routing)。def hello_world():
: 这是一个普通的 Python 函数,我们称之为视图函数 (View Function)。它负责处理特定路由的请求,并返回一个响应。return 'Hello, World!'
: 视图函数返回的字符串就是发送给浏览器显示的响应体。if __name__ == '__main__':
: 这是标准的 Python 写法,确保只有在直接运行app.py
文件时,app.run()
才会被执行。app.run(debug=True)
: 启动 Flask 的内置开发服务器。debug=True
开启调试模式。
5. 运行 Flask 应用
保存 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。
打开你的网页浏览器,访问 http://127.0.0.1:5000/
。
你应该能在浏览器页面上看到 Hello, World!
这几个字。
恭喜你!你已经成功运行了你的第一个 Flask 应用!
要停止服务器,只需在终端中按 Ctrl+C
。
6. 理解 Flask 的核心概念:路由与视图函数
在上面的例子中,@app.route('/')
和 def hello_world():
是 Flask 应用中最基本的两个概念:
- 路由 (Route): 路由是将特定的 URL 路径映射到 Python 函数的过程。当用户通过浏览器访问某个 URL 时,Flask 会查找哪个视图函数与该 URL 路径匹配,然后执行该函数。
- 视图函数 (View Function): 视图函数是与特定路由关联的 Python 函数。它包含处理用户请求的逻辑,并返回一个响应(通常是 HTML 页面、文本或 JSON 数据),这个响应会被发送回用户的浏览器。
我们可以添加更多的路由和视图函数。例如,创建一个关于页面:
修改 app.py
文件:
“`python
from flask import Flask
app = Flask(name)
@app.route(‘/’)
def hello_world():
return ‘Hello, World!’
添加新的路由和视图函数
@app.route(‘/about’)
def about():
return ‘这是一个关于页面。’
if name == ‘main‘:
app.run(debug=True)
“`
保存文件,重新运行 python app.py
。
现在,访问 http://127.0.0.1:5000/
会显示 “Hello, World!”,而访问 http://127.0.0.1:5000/about
会显示 “这是一个关于页面。”。
7. 使用 HTML 模板:分离逻辑与呈现
直接在视图函数中返回 HTML 字符串对于简单的响应来说是可行的,但当页面结构变得复杂时,这样做会变得非常困难和混乱。更好的做法是将页面的呈现逻辑(HTML 代码)与应用的业务逻辑(Python 代码)分离开来。
Flask 默认使用 Jinja2 模板引擎。我们可以将 HTML 代码放在独立的模板文件中,然后在视图函数中渲染这些模板并返回。
步骤:
- 在项目目录下创建一个名为
templates
的文件夹。 Flask 默认会在这个文件夹中寻找模板文件。 -
在
templates
文件夹中创建一个 HTML 文件,比如index.html
。html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>首页</title>
</head>
<body>
<h1>欢迎来到我的 Flask 应用!</h1>
<p>这是使用模板渲染的页面。</p>
</body>
</html>
3. 修改app.py
文件,导入render_template
函数,并在视图函数中使用它来渲染模板。“`python
from flask import Flask, render_template # 导入 render_templateapp = Flask(name)
@app.route(‘/’)
def index(): # 将函数名改为 index 更具语义
“””渲染首页模板”””
# render_template 函数会自动去 templates 文件夹中查找指定的模板文件
return render_template(‘index.html’)@app.route(‘/about’)
def about():
# 你也可以为 about 页面创建模板
# return render_template(‘about.html’)
return ‘这是一个关于页面。’ # 暂时仍返回字符串if name == ‘main‘:
app.run(debug=True)
“`
保存文件,重新运行 python app.py
。
访问 http://127.0.0.1:5000/
,你将看到 index.html
中的内容。
现在,你的 Python 代码只负责处理逻辑(哪个 URL 对应哪个函数),而 HTML 文件负责页面的结构和内容。
8. 向模板传递数据
Web 应用通常需要根据不同的请求动态地显示内容。这意味着视图函数需要将一些数据传递给模板,让模板来展示这些数据。
Jinja2 模板引擎允许你在 HTML 文件中使用特定的语法来显示变量和执行简单的逻辑(如循环、条件判断)。
修改 app.py
的 index
视图函数,向模板传递一个变量:
“`python
from flask import Flask, render_template
app = Flask(name)
@app.route(‘/’)
def index():
# 定义一个变量
page_title = “我的 Flask 应用首页”
welcome_message = “欢迎回来!”
user = {“name”: “访客”, “is_authenticated”: False} # 假设用户数据
# 将变量作为关键字参数传递给 render_template
return render_template(
'index.html',
title=page_title,
message=welcome_message,
current_user=user
)
@app.route(‘/about’)
def about():
return ‘这是一个关于页面。’
if name == ‘main‘:
app.run(debug=True)
“`
修改 templates/index.html
,使用 Jinja2 语法来显示这些传递过来的变量:
“`html
{{ message }}
{% if current_user.is_authenticated %}
你好, {{ current_user.name }}!
{% else %}
你好, 访客。
{% endif %}
这是使用模板渲染的页面。
“`
Jinja2 语法简介:
{{ variable }}
: 用于显示变量或表达式的值。{% statement %}
: 用于执行控制结构,如if
语句、for
循环等。{# comment #}
: 用于添加模板注释,不会显示在最终的 HTML 中。
保存文件,重新运行 python app.py
。
访问 http://127.0.0.1:5000/
。你将看到页面标题和内容都使用了从 Flask 应用传递过来的数据。
9. 处理动态路由与 URL 参数
很多时候,URL 中会包含动态的部分,例如博客文章的 ID、用户的用户名等。Flask 允许你在路由规则中使用变量标记来捕获 URL 中的这些动态部分。
修改 app.py
添加一个用户主页的路由:
“`python
from flask import Flask, render_template
app = Flask(name)
… (之前的 index 和 about 路由) …
定义一个带有动态参数的路由
是一个变量标记,捕获 URL 中 /user/ 后面的部分
@app.route(‘/user/
def show_user_profile(username):
“””显示指定用户的个人主页”””
# 动态参数会自动作为函数的参数传递进来
return f’用户: {username}’ # 返回包含用户名的字符串
你还可以指定参数类型,例如 表示 post_id 必须是整数
@app.route(‘/post/
def show_post(post_id):
“””显示指定 ID 的博客文章”””
# post_id 会作为一个整数传递进来
return f’文章 ID: {post_id}’
if name == ‘main‘:
app.run(debug=True)
“`
保存文件,重新运行 python app.py
。
- 访问
http://127.0.0.1:5000/user/alice
,会显示 “用户: alice”。 - 访问
http://127.0.0.1:5000/user/bob
,会显示 “用户: bob”。 - 访问
http://127.0.0.1:5000/post/123
,会显示 “文章 ID: 123″。 - 访问
http://127.0.0.1:5000/post/abc
,会返回 404 错误,因为abc
不是整数。
Flask 支持多种 URL 参数类型转换器,包括:
* <string>
: 字符串 (默认类型)
* <int>
: 整数
* <float>
: 浮点数
* <path>
: 类似 string,但也接受斜杠 /
* <uuid>
: UUID 字符串
10. 处理 HTTP 方法:GET 与 POST
Web 应用中的请求不仅仅是简单的页面访问(GET 请求)。当用户提交表单、上传文件等操作时,通常会使用 POST 请求或其他 HTTP 方法。
默认情况下,@app.route()
装饰器只响应 GET 请求。你可以通过 methods
参数指定视图函数支持的 HTTP 方法。
例如,创建一个简单的登录页面,需要处理 GET(显示表单)和 POST(处理表单提交)请求:
修改 app.py
:
“`python
from flask import Flask, render_template, request # 导入 request 对象
app = Flask(name)
… (之前的路由) …
定义一个登录页面路由,支持 GET 和 POST 方法
@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
# 如果是 POST 请求,处理登录逻辑
# 从请求的表单数据中获取用户名和密码
username = request.form.get(‘username’) # 使用 get 方法避免 key 不存在时出错
password = request.form.get(‘password’)
# 这里可以添加用户验证逻辑
if username == 'admin' and password == 'password':
# 登录成功,可以重定向到其他页面
return '登录成功!欢迎回来,admin!' # 暂时返回字符串
else:
# 登录失败
error = '用户名或密码错误'
# 重新渲染登录页面,并显示错误信息
return render_template('login.html', error=error)
else:
# 如果是 GET 请求,显示登录表单
return render_template('login.html')
if name == ‘main‘:
app.run(debug=True)
“`
在 templates
文件夹中创建 login.html
文件:
“`html
用户登录
{% if error %}
{{ error }}
{% endif %}
“`
保存文件,重新运行 python app.py
。
访问 http://127.0.0.1:5000/login
。
* 首次访问(GET 请求)会看到登录表单。
* 在表单中输入用户名和密码,点击登录按钮(POST 请求)。
* 如果输入 admin
和 password
,会看到 “登录成功!欢迎回来,admin!”。
* 如果输入其他内容,会重新显示表单并显示错误信息 “用户名或密码错误”。
request
对象: flask.request
对象包含了当前请求的所有信息,如请求方法 (request.method
)、表单数据 (request.form
)、查询参数 (request.args
)、请求头 (request.headers
) 等。你需要从 flask
中导入它才能使用。
11. 获取请求数据:表单与查询参数
在上面的登录例子中,我们使用了 request.form.get('username')
来获取 POST 请求中的表单数据。request.form
是一个字典,包含了 POST 请求体中以 application/x-www-form-urlencoded
或 multipart/form-data
编码的表单字段数据。
除了表单数据,用户请求有时也会通过 URL 中的查询字符串传递数据,例如 http://example.com/search?q=python&category=web
。这些数据可以通过 request.args
获取。request.args
也是一个字典,包含了 URL 中 ?
后面的参数。
修改 app.py
添加一个搜索功能的路由:
“`python
from flask import Flask, render_template, request
app = Flask(name)
… (之前的路由) …
定义一个搜索路由,支持 GET 方法
@app.route(‘/search’)
def search():
# 从请求的查询参数中获取搜索关键词 ‘q’
query = request.args.get(‘q’)
if query:
# 如果有搜索关键词,执行搜索逻辑(这里只是模拟)
results = [f"搜索结果 1 for '{query}'", f"搜索结果 2 for '{query}'"]
return render_template('search_results.html', query=query, results=results)
else:
# 如果没有关键词,显示搜索表单
return render_template('search_form.html')
if name == ‘main‘:
app.run(debug=True)
“`
在 templates
文件夹中创建 search_form.html
文件:
“`html
搜索示例
“`
在 templates
文件夹中创建 search_results.html
文件:
“`html
搜索结果 for “{{ query }}”
{% if results %}
-
{% for result in results %} {# Jinja2 循环语法 {% for … in … %} {% endfor %} #}
- {{ result }}
{% endfor %}
{% else %}
未找到相关结果。
{% endif %}
“`
保存文件,重新运行 python app.py
。
访问 http://127.0.0.1:5000/search
,你会看到搜索表单。
输入关键词(例如 flask
),点击搜索。URL 会变成 http://127.0.0.1:5000/search?q=flask
,然后页面会显示搜索结果。
注意在 search_form.html
中使用了 {{ url_for('search') }}
。url_for()
是 Flask 提供的一个非常有用的函数,它可以根据视图函数的名称动态生成 URL。这样做的好处是,如果将来你改变了路由规则(例如将 /search
改为 /find
),你只需要修改 @app.route
装饰器,而模板中的 url_for
会自动生成正确的 URL,避免了硬编码 URL 带来的维护问题。使用 url_for()
需要从 flask
中导入它。
12. 重定向与错误处理
在 Web 应用中,经常需要进行页面之间的跳转(重定向)或显示错误页面(如 404 Not Found)。
重定向 (Redirect):
当你成功处理了一个 POST 请求(例如创建了新用户或提交了表单)后,通常不应该直接渲染页面,而是应该重定向到另一个页面,以防止用户刷新页面导致重复提交。
使用 redirect()
函数可以实现重定向,通常结合 url_for()
来生成目标 URL。
修改 login
视图函数,在登录成功后重定向到首页:
“`python
from flask import Flask, render_template, request, redirect, url_for # 导入 redirect 和 url_for
app = Flask(name)
… (其他路由) …
@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
username = request.form.get(‘username’)
password = request.form.get(‘password’)
if username == 'admin' and password == 'password':
# 登录成功,重定向到 index 视图函数对应的 URL
return redirect(url_for('index')) # index 是上面定义的处理 '/' 的视图函数名
else:
error = '用户名或密码错误'
return render_template('login.html', error=error)
else:
return render_template('login.html')
if name == ‘main‘:
app.run(debug=True)
“`
保存文件,重新运行 python app.py
。现在用 admin/password
登录成功后,页面会跳转回首页 (/
)。
错误处理 (Error Handling):
当用户访问一个不存在的 URL 时,Flask 会自动返回一个 404 Not Found 错误页面。你也可以自定义这些错误页面。
使用 abort()
函数可以手动触发一个 HTTP 错误,例如:
“`python
from flask import Flask, render_template, request, redirect, url_for, abort # 导入 abort
app = Flask(name)
… (其他路由) …
@app.route(‘/user/
def show_user_profile(username):
users = [“alice”, “bob”, “admin”] # 假设存在的用户列表
if username in users:
return f’用户: {username}’
else:
# 如果用户不存在,返回 404 Not Found 错误
abort(404)
你还可以自定义错误页面
@app.errorhandler(404)
def page_not_found(error):
“””自定义 404 错误页面”””
return render_template(‘404.html’), 404 # 返回模板和 HTTP 状态码
if name == ‘main‘:
app.run(debug=True)
“`
创建 templates/404.html
文件:
“`html
哎呀!页面不见了 (404)
您访问的页面不存在。
“`
保存文件,重新运行 python app.py
。访问一个不存在的用户(如 http://127.0.0.1:5000/user/charlie
)或一个不存在的路由,你将看到自定义的 404 页面。@app.errorhandler()
装饰器用于注册一个错误处理器,当发生指定状态码的错误时,就会调用这个函数。视图函数返回的元组中,第一个元素是响应体,第二个元素是 HTTP 状态码。
常见的 HTTP 状态码:
* 200 OK
: 请求成功。
* 302 Found
(或 301 Moved Permanently
): 重定向。
* 404 Not Found
: 请求的资源不存在。
* 500 Internal Server Error
: 服务器内部错误。
13. 项目结构初探
对于简单的单文件应用 (app.py
),上面的结构已经足够。但随着项目变大,将所有代码都放在一个文件里会变得难以管理。一个更常见的 Flask 项目结构如下:
your_project_folder/
├── venv/ # 虚拟环境目录
├── app.py # Flask 应用实例的创建和配置
├── routes.py # 路由和视图函数定义
├── templates/ # HTML 模板文件
│ ├── index.html
│ ├── login.html
│ └── ...
├── static/ # 静态文件 (CSS, JS, images)
│ ├── css/
│ ├── js/
│ └── images/
├── requirements.txt # 项目依赖列表 (通过 pip freeze > requirements.txt 生成)
└── ...
在 app.py
中创建 Flask 应用实例,并在 routes.py
中定义路由和视图函数,然后在 app.py
中导入这些路由。对于更大型的项目,可以使用 Flask 的 蓝图 (Blueprints) 来组织模块化的代码。但这超出了”从零开始”的范畴,你可以在后续学习中深入了解。
现在你可以尝试将 app.py
中的路由部分迁移到 routes.py
中,然后在 app.py
中导入 routes
模块。
14. Flask 扩展简介
Flask 本身只提供了 Web 开发的核心功能。但其最大的优势在于丰富的扩展生态系统。通过安装和使用各种 Flask 扩展,你可以轻松地为应用添加数据库、用户认证、表单处理、RESTful API 等功能。
一些常用的 Flask 扩展:
- Flask-SQLAlchemy: 集成 SQLAlchemy (一个流行的 Python ORM),方便地进行数据库操作。
- Flask-WTF: 集成 WTForms,简化 Web 表单的创建、验证和渲染。
- Flask-Login: 提供用户会话管理、认证、授权等功能。
- Flask-Migrate: 集成 Alembic,用于数据库模式迁移。
- Flask-RESTful: 快速构建 RESTful API。
- Flask-DebugToolbar: 提供一个调试工具栏,方便在浏览器中查看请求、配置、日志等信息。
安装扩展通常也非常简单,例如安装 Flask-SQLAlchemy:
bash
pip install Flask-SQLAlchemy
然后在你的代码中导入并初始化扩展。每个扩展的使用方式不同,需要查阅其官方文档。
15. 下一步:进阶学习方向
恭喜你已经掌握了 Flask 的基础知识,能够构建简单的 Web 应用了!从这里开始,你可以继续深入学习以下方面:
- 表单处理和验证: 使用 Flask-WTF 处理用户提交的表单数据并进行验证。
- 数据库集成: 学习如何使用 Flask-SQLAlchemy 连接数据库(如 SQLite, PostgreSQL, MySQL),创建模型,进行数据的增删改查。
- 用户认证与授权: 使用 Flask-Login 实现用户注册、登录、注销、权限控制等功能。
- 构建 RESTful API: 学习如何使用 Flask 或 Flask-RESTful 构建供其他应用调用的 API。
- 蓝图 (Blueprints): 学习如何使用蓝图组织大型 Flask 项目的代码结构。
- 上下文 (Contexts): 深入理解请求上下文 (Request Context) 和应用上下文 (Application Context)。
- 测试: 学习如何为你的 Flask 应用编写单元测试和集成测试。
- 部署: 学习如何将你的 Flask 应用部署到生产环境,例如使用 Gunicorn 或 uWSGI 作为 WSGI 服务器,配合 Nginx 或 Apache,以及部署到云平台(如 Heroku, Vercel, AWS, 阿里云等)。
- 安全: 学习 Web 应用常见的安全问题(如 XSS, CSRF)以及如何在 Flask 中防范它们。
Flask 官方文档 (https://flask.palletsprojects.com/) 是你进一步学习的最佳资源。同时,也可以参考各种在线教程、书籍和开源项目。
总结
本文从零开始,详细介绍了 Flask 微框架的基础知识,包括环境搭建、安装、创建第一个应用、路由、模板、动态 URL、HTTP 方法、请求数据获取、重定向和错误处理等核心概念。你已经学会了如何使用 Flask 构建一个简单的 Web 应用,并对如何组织项目以及 Flask 的扩展生态有了一定的了解。
Flask 的哲学是“少即是多”,它为你提供了坚实的基础和极大的灵活性。通过不断实践和学习各种扩展,你将能够使用 Flask 构建出功能强大、满足各种需求的 Web 应用。
学习编程和框架是一个持续的过程,关键在于多动手实践。尝试根据本文的例子,修改代码,添加新功能,构建自己的小项目。在实践中遇到问题,查阅文档或搜索解决方案,是提升技能的最好方式。
祝你在 Flask 的学习和开发之旅中取得成功!