Flask 入门教程:轻松构建你的第一个Web应用
欢迎来到精彩的Web开发世界!如果你正在寻找一个既强大又灵活、同时对初学者友好的Python Web框架,那么 Flask 绝对是一个绝佳的选择。不同于一些“全栈”框架(如 Django,它提供了数据库ORM、管理后台等许多内置功能),Flask 是一个“微框架”(microframework)。这意味着它提供的是构建Web应用的核心功能——请求处理和路由,而将其他决策(如数据库选择、模板引擎选择——尽管它默认推荐 Jinja2)留给开发者自己。这种设计哲学使得 Flask 极其灵活,非常适合小型项目、API开发,或者当你想要完全掌控项目结构和技术栈时。
本篇教程将带你从零开始,一步步走进 Flask 的世界。我们将涵盖 Flask 的核心概念、环境搭建、基本应用构建、模板渲染、处理静态文件、处理表单数据等基础知识。通过学习,你将能够独立构建一个简单的动态Web应用。
预计学习时长: 2-4小时,取决于你的Python基础和练习时间。
目录
- 什么是 Flask?为什么选择它?
- 准备工作:安装 Python 和虚拟环境
- 搭建你的第一个 Flask 项目
- 创建项目目录和虚拟环境
- 安装 Flask
- 你的第一个 Flask 应用:”Hello, World!”
- 编写代码
- 运行应用
- 代码解释
- 深入理解路由(Routes)
- 基本路由
- 带变量的路由
- HTTP 方法:GET 和 POST
- 使用模板(Templates)渲染HTML
- 为什么需要模板?
- Jinja2 模板引擎
- 创建模板文件
- 在 Flask 中使用模板
- 向模板传递数据
- 处理静态文件(Static Files)
- 为什么需要静态文件?
- 静态文件目录结构
- 在模板中链接静态文件
- 处理表单数据(Forms)
- 创建HTML表单
- 在 Flask 中接收表单数据
- GET vs POST 处理
- 构建URL:
url_for()
函数- 为什么避免硬编码URL?
url_for()
的用法
- 调试你的 Flask 应用
- 整合应用:构建一个简单的示例
- 下一步:继续学习
1. 什么是 Flask?为什么选择它?
Flask 是一个使用 Python 语言编写的轻量级 Web 服务器网关接口(WSGI)Web 应用框架。它由 Armin Ronacher 开发,基于 Werkzeug WSGI 工具箱和 Jinja2 模板引擎。
为什么选择 Flask?
- 微框架特性: 它只包含Web开发的核心功能,不强制你使用特定的工具或库来处理数据库、表单验证等。这给了开发者极大的自由度去选择最适合项目的组件。
- 易于上手: 代码简洁,学习曲线平缓,非常适合新手入门Web开发。你可以很快地搭建起一个可工作的Web应用。
- 灵活性: 它的组件是可插拔的,你可以轻松集成各种第三方库来扩展功能,例如 SQLAlchemy 用于数据库、WTForms 用于表单、Flask-Login 用于用户认证等等。
- 完善的文档: Flask 拥有高质量且详细的官方文档。
- 活跃的社区: 庞大的用户群体意味着你在遇到问题时很容易找到帮助。
总之,如果你想快速构建一个原型、开发一个API服务,或者偏爱自由选择项目组件,Flask 是一个非常棒的选择。
2. 准备工作:安装 Python 和虚拟环境
在开始之前,你需要确保你的计算机上已经安装了 Python。推荐使用 Python 3.6 或更高版本。你可以在 Python 官网 (python.org) 下载并安装。
强烈建议使用虚拟环境!
在Python开发中,虚拟环境(Virtual Environment)是一个独立的环境,它允许你安装特定项目所需的库,而不会影响系统中其他Python项目或系统自带的Python环境。这可以有效避免不同项目之间库版本冲突的问题。
Python 3.3+ 内置了 venv
模块,使用起来非常方便。
创建虚拟环境:
打开你的终端或命令行工具(Windows 用户推荐使用 Git Bash 或 PowerShell),导航到你想要创建项目的目录。然后执行以下命令:
“`bash
对于 macOS/Linux 用户
python3 -m venv venv
对于 Windows 用户 (可能需要根据安装路径调整 python 命令)
python -m venv venv
“`
这会在当前目录下创建一个名为 venv
的文件夹,里面包含了独立的Python解释器和pip工具。
激活虚拟环境:
在安装任何库之前,你需要激活虚拟环境。
“`bash
对于 macOS/Linux 用户
source venv/bin/activate
对于 Windows 用户 (在 PowerShell 中)
.\venv\Scripts\Activate.ps1
对于 Windows 用户 (在 Command Prompt 中)
venv\Scripts\activate.bat
“`
激活后,你会看到终端提示符前面出现了虚拟环境的名称(通常是 (venv)
),这表示你当前正处于虚拟环境中。
退出虚拟环境:
当你完成工作时,可以输入 deactivate
命令退出虚拟环境。
现在,你已经准备好开始搭建 Flask 项目了。
3. 搭建你的第一个 Flask 项目
我们来创建一个简单的项目目录结构。
-
创建项目目录:
在一个合适的位置创建一个文件夹,例如my_flask_app
。bash
mkdir my_flask_app
cd my_flask_app -
创建并激活虚拟环境:
在这个新的目录中创建并激活虚拟环境(如果你之前没有创建的话)。bash
python3 -m venv venv
source venv/bin/activate
(Windows 用户请使用相应的命令激活) -
安装 Flask:
在激活的虚拟环境中,使用 pip 安装 Flask。bash
pip install Flaskpip 会下载并安装 Flask 及其依赖项(Werkzeug, Jinja2, itsdangerous, MarkupSafe, click)。安装完成后,你可以使用
pip list
查看当前虚拟环境中安装的库。
4. 你的第一个 Flask 应用:”Hello, World!”
现在,我们来编写一个最简单的 Flask 应用,让它在浏览器中显示 “Hello, World!”。
-
创建应用文件:
在项目目录my_flask_app
下创建一个 Python 文件,命名为app.py
。 -
编写代码:
打开app.py
文件,输入以下代码:“`python
from flask import Flask创建一个 Flask 应用实例
name 是一个特殊的 Python 变量。
当一个脚本作为主程序运行时,name 的值是 ‘main‘。
Flask 使用这个参数来确定应用根目录,以便找到资源文件(如模板和静态文件)。
app = Flask(name)
使用装饰器 @app.route() 定义 URL 路由
这个装饰器告诉 Flask 当用户访问网站的根 URL (‘/’) 时,执行下面的函数。
@app.route(‘/’)
def hello_world():
# 函数返回的内容将作为 HTTP 响应发送给浏览器
return ‘Hello, World! This is my first Flask app!’这个条件判断确保只有在直接运行 app.py 文件时,才会启动开发服务器
如果这个文件被其他脚本导入,那么下面的代码块将不会执行
if name == ‘main‘:
# app.run() 启动 Flask 内置的开发服务器
# debug=True 开启调试模式:
# 1. 当代码修改时,服务器会自动重新加载。
# 2. 当发生错误时,会在浏览器中显示详细的调试信息。
# 注意:在生产环境中绝不能开启调试模式!
app.run(debug=True)
“` -
运行应用:
保存app.py
文件。确保你仍在项目目录my_flask_app
下,并且虚拟环境已激活。然后在终端中运行: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)这表示你的 Flask 应用已经在本地的 5000 端口启动了。
-
在浏览器中访问:
打开你的Web浏览器,访问地址http://127.0.0.1:5000/
。你应该能看到页面显示 “Hello, World! This is my first Flask app!”。 -
停止应用:
在终端中按下Ctrl+C
来停止服务器。
代码解释:
from flask import Flask
: 导入 Flask 类。app = Flask(__name__)
: 创建 Flask 应用的实例。__name__
参数是必须的,用于告诉 Flask 应用在哪里寻找资源。@app.route('/')
: 这是一个装饰器(Decorator)。它将紧随其后的函数与特定的 URL 路径(/
,即根路径)关联起来。当浏览器访问/
时,就会调用这个函数。def hello_world():
: 定义一个函数来处理/
路径的请求。函数名可以是任意合法的Python标识符。return '...'
: 函数返回一个字符串。Flask 将这个字符串作为 HTTP 响应的主体发送回浏览器。默认情况下,返回的响应类型是text/html
。if __name__ == '__main__':
: 这是一个标准的 Python 结构,确保app.run()
只在直接执行app.py
文件时运行。app.run(debug=True)
: 启动 Flask 的开发服务器。debug=True
开启调试模式,方便开发。
5. 深入理解路由(Routes)
路由是将 URL 路径映射到处理该请求的函数的过程。在 Flask 中,通过 @app.route()
装饰器来定义路由。
基本路由
我们已经在 “Hello, World!” 例子中看到了基本路由 @app.route('/')
。你可以创建更多的路由:
“`python
… (前面的导入和 app = Flask(name) 保持不变)
@app.route(‘/’)
def index():
return ‘This is the homepage.’
@app.route(‘/about’)
def about():
return ‘This is the about page.’
@app.route(‘/contact’)
def contact():
return ‘Contact us at [email protected]’
… (if name == ‘main‘: app.run(debug=True) 保持不变)
“`
现在运行 python app.py
,访问 http://127.0.0.1:5000/
会看到首页内容,访问 http://127.0.0.1:5000/about
会看到关于页面内容,访问 http://127.0.0.1:5000/contact
会看到联系页面内容。
带变量的路由
很多时候,URL 中需要包含可变的部分,例如用户ID、文章ID等。Flask 允许你在路由中定义变量:
“`python
@app.route(‘/user/
def show_user_profile(username):
# show the user profile for that user
return f’User: {username}’
@app.route(‘/post/
def show_post(post_id):
# show the post with the given id, the id is an integer
return f’Post ID: {post_id}’
“`
<username>
: 这是一个 URL 变量。Flask 会捕获 URL 中<username>
位置的值,并将其作为关键字参数传递给show_user_profile
函数。默认情况下,URL 变量被视为字符串。<int:post_id>
: 你可以在变量名前指定一个转换器(converter),例如int
。这将确保 URL 变量必须是整数,并且在传递给函数时已经被转换为整数类型。Flask 内置了常见的转换器,如string
,int
,float
,path
(包含斜杠的字符串),uuid
。
现在,访问 /user/alice
会显示 “User: alice”,访问 /post/123
会显示 “Post ID: 123″。如果你访问 /post/abc
,Flask 会返回一个 404 Not Found 错误,因为 abc
不是一个整数。
HTTP 方法:GET 和 POST
Web 应用通常需要处理不同的 HTTP 请求方法,最常见的是 GET(获取资源)和 POST(提交数据)。默认情况下,Flask 路由只响应 GET 请求。你可以使用 methods
参数指定允许的方法:
“`python
from flask import request # 需要导入 request 对象
@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
# 处理 POST 请求,例如获取表单数据
# request.form 是一个类字典对象,包含表单提交的数据
username = request.form[‘username’]
password = request.form[‘password’]
# 这里可以添加验证逻辑
return f’Processing login for {username}’
else:
# 处理 GET 请求,通常是显示一个表单
return ‘Show login form’
… (其他路由和 main 部分)
“`
在上面的例子中,访问 /login
使用 GET 请求会显示 “Show login form”。如果通过一个表单以 POST 方法提交数据到 /login
,就会执行 if request.method == 'POST':
下的代码块。我们将在后续的表单部分详细讨论如何处理 POST 数据。
6. 使用模板(Templates)渲染HTML
前面的例子中,我们直接在 Flask 函数中返回 HTML 字符串。对于简单的页面尚可,但对于复杂的页面,直接拼接 HTML 字符串既不方便维护,也容易出错。模板引擎就是用来解决这个问题的。
Flask 默认推荐和集成了 Jinja2 模板引擎。Jinja2 允许你编写包含特殊标记的文本文件(通常是 HTML),在运行时,这些标记会被替换为实际的数据,生成最终的 HTML 页面。
为什么需要模板?
- 代码与内容的职责分离: Python 代码负责处理业务逻辑和数据,HTML 模板负责页面的结构和展示。
- 可重用性: 可以创建布局模板,让其他页面继承,避免重复编写 HTML 头部、尾部等公共部分。
- 动态内容: 轻松地将 Python 代码中的数据(变量、列表、字典等)嵌入到 HTML 中。
Jinja2 模板引擎
Jinja2 使用以下几种标记:
{{ variable }}
: 用于输出变量或表达式的值。{% control_structure %}
: 用于控制流,如if
语句、for
循环等。{# comment #}
: 用于添加注释,不会输出到最终的 HTML 中。
创建模板文件
Flask 会默认在应用根目录下的一个名为 templates
的子目录中查找模板文件。所以,首先在 my_flask_app
目录下创建一个 templates
文件夹:
bash
mkdir templates
然后,在 templates
文件夹中创建一个 HTML 文件,例如 index.html
:
“`html
Welcome to {{ page_name }}
{{ content }}
Items:
-
{% for item in items %}
- {{ item }}
{% endfor %}
“`
在这个模板中:
* {{ title }}
, {{ page_name }}
, {{ content }}
是将要从 Flask 应用传递过来的变量。
* {% for item in items %}
和 {% endfor %}
是 Jinja2 的循环结构,用于遍历 items
列表。
* <li>{{ item }}</li>
在每次循环中输出列表中的一个元素。
在 Flask 中使用模板
修改 app.py
文件,使用 render_template
函数来渲染 index.html
模板:
“`python
from flask import Flask, render_template # 需要导入 render_template 函数
app = Flask(name)
@app.route(‘/’)
def index():
# render_template() 函数会在 templates 文件夹中查找指定的模板文件
# 并将后续的关键字参数传递给模板作为变量
return render_template(‘index.html’,
title=’Homepage’,
page_name=’My Flask App’,
content=’This is some dynamic content.’,
items=[‘Item 1’, ‘Item 2’, ‘Item 3’])
… (其他路由和 main 部分)
“`
注意: 你需要确保 templates
文件夹与 app.py
文件位于同一级目录下。
现在运行 python app.py
,访问 http://127.0.0.1:5000/
。你应该看到一个使用 index.html
模板渲染的页面,其中的变量和列表内容都已经被替换成了 Python 代码中传递的值。
7. 处理静态文件(Static Files)
Web 应用通常需要使用 CSS 文件来控制样式,JavaScript 文件来实现客户端交互,以及图片等其他静态资源。Flask 提供了一种简单的方式来处理这些静态文件。
Flask 会默认在应用根目录下的一个名为 static
的子目录中查找静态文件。
-
创建静态文件目录:
在my_flask_app
目录下创建一个static
文件夹:bash
mkdir static -
创建静态文件:
在static
文件夹中创建一个 CSS 文件,例如style.css
:“`css
/ static/style.css /
body {
font-family: sans-serif;
line-height: 1.6;
margin: 20px;
background-color: #f4f4f4;
}h1 {
color: #333;
}ul {
list-style: disc;
margin-left: 20px;
}
“` -
在模板中链接静态文件:
修改templates/index.html
文件,在<head>
部分添加一个链接来引入style.css
:“`html
<!DOCTYPE html>
{{ title }}
Welcome to {{ page_name }}
{{ content }}
<h2>Items:</h2> <ul> {% for item in items %} <li>{{ item }}</li> {% endfor %} </ul>
“`这里我们使用了
{{ url_for('static', filename='style.css') }}
。url_for()
函数用于根据函数名(这里是 Flask 内置的用于处理静态文件的视图函数static
)和参数(filename='style.css'
指定要查找的文件名)来动态生成 URL。这种方式比硬编码/static/style.css
更好,因为如果将来静态文件的位置或处理方式发生变化,你不需要修改模板文件,只需要修改 Flask 应用的配置即可。
运行应用并访问首页,你应该能看到页面应用了 style.css
中定义的样式。
8. 处理表单数据(Forms)
Web 应用的核心功能之一就是接收用户的输入,通常通过 HTML 表单来实现。Flask 可以轻松地接收和处理表单提交的数据。
我们将创建一个简单的表单,让用户输入名字,然后提交后显示一个问候语。
-
创建表单模板:
在templates
目录下创建一个form.html
文件:html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Simple Form</title>
</head>
<body>
<h1>Enter Your Name</h1>
<!--
method="POST": 指定表单提交时使用 POST 方法
action="{{ url_for('process_form') }}": 指定表单提交到哪个 URL
url_for('process_form') 会查找名为 process_form 的路由函数,并生成对应的 URL
-->
<form method="POST" action="{{ url_for('process_form') }}">
<label for="name">Name:</label>
<!-- input 标签的 name 属性非常重要,Flask 会使用它来获取输入的值 -->
<input type="text" id="name" name="user_name" required>
<button type="submit">Submit</button>
</form>
</body>
</html> -
创建处理表单的 Flask 路由:
修改app.py
,添加两个路由:一个用于显示表单(GET请求),另一个用于处理表单提交(POST请求)。“`python
from flask import Flask, render_template, request, redirect, url_for # 需要导入 request, redirect, url_forapp = Flask(name)
Route for displaying the form (GET) and processing it (POST)
@app.route(‘/form’, methods=[‘GET’, ‘POST’])
def handle_form():
if request.method == ‘POST’:
# 获取表单中 name=”user_name” 的输入框的值
user_name = request.form.get(‘user_name’) # 使用 .get() 方法更安全,如果键不存在不会报错
if user_name:
# 如果获取到名字,重定向到 greeting 页面
# 将名字作为 URL 参数传递
return redirect(url_for(‘show_greeting’, name=user_name))
else:
# 如果名字为空,可以返回错误信息或重新显示表单
return “Name is required!”, 400 # 返回错误信息和状态码 400 Bad Requestelse: # request.method == 'GET' # 显示表单页面 return render_template('form.html')
Route for displaying the greeting
@app.route(‘/greet/
‘)
def show_greeting(name):
# 显示问候语页面
return f’Hello, {name}!’… (其他路由和 main 部分)
“`
在上面的代码中:
* @app.route('/form', methods=['GET', 'POST'])
: 定义 /form
路由可以处理 GET 和 POST 请求。
* if request.method == 'POST':
: 检查请求方法是否为 POST。
* user_name = request.form.get('user_name')
: 使用 request.form
获取 POST 提交的表单数据。request.form
是一个字典,键是输入框的 name
属性值(这里是 user_name
),值是用户输入的内容。使用 .get()
方法可以避免在键不存在时出错。
* redirect(url_for('show_greeting', name=user_name))
: 如果成功获取名字,使用 redirect
函数将用户重定向到 show_greeting
路由。url_for('show_greeting', name=user_name)
会生成像 /greet/Alice
这样的 URL,其中 name=user_name
作为参数传递给了 show_greeting
函数对应的路由变量。这种 Post/Redirect/Get 模式是一种常见的Web开发模式,可以避免用户刷新页面时重复提交表单。
* else:
: 如果请求方法是 GET,渲染并显示 form.html
模板。
* @app.route('/greet/<name>')
: 定义一个带变量的路由,接收名字作为参数。
运行应用,访问 http://127.0.0.1:5000/form
。填写名字并提交,你会看到页面重定向到 /greet/你的名字
并显示问候语。
注意: 对于更复杂的表单处理和验证,推荐使用 Flask-WTF 这样的扩展库。
9. 构建URL:url_for()
函数
我们已经在模板中使用了 url_for()
函数来链接静态文件和处理表单的 action
属性。url_for()
函数是 Flask 中一个非常重要的工具。
为什么避免硬编码URL?
硬编码 URL (例如直接在模板中写 /about
或 /static/style.css
) 有几个缺点:
- 维护困难: 如果你的 URL 结构发生变化(例如
/about
改为/info
),你需要修改所有引用这个 URL 的地方(代码和模板)。 - 可读性差:
url_for('show_user_profile', username='Alice')
比硬编码/user/Alice
更清晰地表达了 URL 的含义和来源。 - 处理变量和参数: 对于带变量的路由,硬编码更是不切实际。
url_for()
的用法
url_for()
函数接收视图函数的名称作为第一个参数,以及任何数量的关键字参数,每个关键字参数对应 URL 规则中的变量部分。
url_for('index')
: 生成对应index
函数(即@app.route('/')
)的 URL,结果是/
。url_for('show_user_profile', username='Peter')
: 生成对应show_user_profile
函数(即@app.route('/user/<username>')
)的 URL,结果是/user/Peter
。url_for('show_post', post_id=42)
: 生成对应show_post
函数(即@app.route('/post/<int:post_id>')
)的 URL,结果是/post/42
。url_for('static', filename='js/main.js')
: 生成对应处理静态文件的内置视图函数static
的 URL,结果通常是/static/js/main.js
。url_for('handle_form')
: 生成对应handle_form
函数(即@app.route('/form')
)的 URL,结果是/form
。url_for('show_greeting', name='Alice')
: 生成对应show_greeting
函数(即@app.route('/greet/<name>')
)的 URL,结果是/greet/Alice
。
总结: 始终使用 url_for()
来生成 URL,无论是代码中还是模板中。这会让你的应用更加健壮和易于维护。
10. 调试你的 Flask 应用
在开发过程中,错误是难以避免的。Flask 的调试模式 (debug=True
在 app.run()
) 为你提供了非常有用的帮助。
当调试模式开启时:
- 自动重载: 你修改 Python 代码后,服务器会自动检测到变化并重新加载,无需手动重启。
- 交互式调试器: 当应用发生错误时,浏览器中会显示一个详细的错误页面,包含了堆栈跟踪(traceback)。最强大的是,你可以点击堆栈帧(stack frame)旁边的控制台图标,进入一个交互式的 Python shell,在错误发生的上下文中检查变量的值、执行代码等,这极大地提高了调试效率。
注意: 正如之前提到的,在生产环境中绝不能开启调试模式,因为它会暴露应用的内部信息和执行任意代码的能力,存在严重的安全风险。在部署时,应该关闭 debug=True
。
11. 整合应用:构建一个简单的示例
现在让我们把学到的知识点整合起来,构建一个稍微复杂一点的示例:一个简单的访客留言板(不涉及数据库,数据不持久化,仅用于演示)。
-
创建目录结构:
my_guestbook_app/
├── venv/ (虚拟环境)
├── static/
│ └── style.css
├── templates/
│ ├── index.html
│ └── greeting.html
└── app.py -
app.py
:“`python
from flask import Flask, render_template, request, redirect, url_forapp = Flask(name)
模拟存储留言,重启服务器会丢失
messages = []
@app.route(‘/’)
def index():
# 显示所有留言的页面
return render_template(‘index.html’, messages=messages)@app.route(‘/submit_message’, methods=[‘POST’])
def submit_message():
if request.method == ‘POST’:
user_name = request.form.get(‘name’)
message_text = request.form.get(‘message’)if user_name and message_text: messages.append({'name': user_name, 'text': message_text}) # 提交成功后重定向回首页,显示新的留言 return redirect(url_for('index')) else: # 处理输入不完整的情况 return "Name and Message are required!", 400
@app.route(‘/add’)
def add_message_form():
# 显示添加留言的表单页面
return render_template(‘greeting.html’) # 复用之前的 greeting.html 作为表单页if name == ‘main‘:
app.run(debug=True)
“` -
templates/index.html
:
(用于显示留言列表和提交表单)“`html
<!DOCTYPE html>
Guestbook
Guestbook Messages
{% if messages %} <ul> {% for msg in messages %} <li><strong>{{ msg.name }}:</strong> {{ msg.text }}</li> {% endfor %} </ul> {% else %} <p>No messages yet.</p> {% endif %} <hr> <h2>Leave a Message</h2> <!-- 表单提交到 /submit_message 路由 --> <form method="POST" action="{{ url_for('submit_message') }}"> <div> <label for="name">Name:</label><br> <input type="text" id="name" name="name" required> </div> <div> <label for="message">Message:</label><br> <textarea id="message" name="message" rows="4" required></textarea> </div> <button type="submit">Submit Message</button> </form>
“` -
templates/greeting.html
:
(作为演示,我们直接使用index.html
包含表单即可,不再需要独立的greeting.html
文件了。上面代码中@app.route('/add')
可以删除或修改,这里我们删除它,只通过/
首页来提交留言。) -
static/style.css
:
(可以保持原样或稍作修改)“`css
/ static/style.css /
body {
font-family: sans-serif;
line-height: 1.6;
margin: 20px;
background-color: #f4f4f4;
}h1, h2 {
color: #333;
border-bottom: 1px solid #ccc;
padding-bottom: 5px;
margin-top: 20px;
}ul {
list-style: none; / 取消默认列表样式 /
padding: 0;
}li {
background-color: #fff;
border: 1px solid #ddd;
margin-bottom: 10px;
padding: 10px;
border-radius: 5px;
}form div {
margin-bottom: 15px;
}label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}input[type=”text”],
textarea {
width: 100%; / 让输入框和文本域占据父容器宽度 /
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box; / 包含 padding 和 border 在元素总宽度内 /
}button {
background-color: #5cb85c;
color: white;
padding: 10px 15px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}button:hover {
background-color: #4cae4c;
}“`
运行 python app.py
,访问 http://127.0.0.1:5000/
。你现在可以看到一个简单的留言板页面,可以在下方填写名字和留言并提交。提交后页面会刷新,显示你刚刚添加的留言。
这个例子虽然简单,但它结合了路由、模板、静态文件、表单处理、重定向等核心概念,是你进一步学习 Flask 的良好基础。
12. 下一步:继续学习
恭喜你!你已经掌握了 Flask 的基本用法,能够构建简单的动态Web应用了。但这仅仅是开始。Flask 生态系统非常丰富,有许多强大的扩展可以帮助你构建更复杂的应用。接下来,你可以学习:
- 数据库集成: 如何使用 SQLAlchemy 或其他 ORM 与数据库交互,实现数据的持久化。
- 用户认证与授权: 如何实现用户注册、登录、会话管理和访问控制(例如使用 Flask-Login)。
- 表单验证: 使用 Flask-WTF 等库进行更健壮的表单处理和验证。
- RESTful API: 如何使用 Flask 构建 API 服务(例如使用 Flask-RESTful 或 Flask-RESTx)。
- 应用结构: 如何组织大型 Flask 项目的代码结构(蓝图 Blueprints)。
- 测试: 如何为你的 Flask 应用编写测试。
- 部署: 如何将你的 Flask 应用部署到生产环境(如 Gunicorn/uWSGI + Nginx/Apache,或使用平台服务如 Heroku, Vercel)。
- 更多 Flask 扩展: 探索 Flask 生态系统中其他有用的扩展,如 Flask-Migrate (数据库迁移)、Flask-Mail (发送邮件) 等等。
官方文档是最好的学习资源,同时也有许多优秀的在线教程和书籍可以参考。
结论
Flask 是一个优雅、灵活且功能强大的 Python Web 框架。本教程带你走过了 Flask 入门的最关键步骤,从环境搭建到构建一个简单的交互式Web页面。希望你现在对 Flask 有了一个清晰的认识,并对用它来创建更多有趣的Web应用充满信心。
记住,学习编程和框架最好的方式就是动手实践。不断尝试修改代码、添加新功能、解决遇到的问题。祝你在 Flask 的学习旅程中一切顺利!