- 通过 HTML
<form>提交数据(POST 请求):这是最常见的方式,用于用户登录、注册、发表评论等场景。 - 通过 URL 查询字符串传递数据(GET 请求):用于搜索、分页等场景,数据会直接显示在 URL 中。
通过 HTML 表单接收数据 (POST)
这是处理用户输入的标准方式,我们将创建两个页面:

(图片来源网络,侵删)
- 一个 HTML 页面 (
index.html) 包含一个表单。 - 一个 Flask 路由 () 用来显示这个表单。
- 另一个 Flask 路由 (
/login) 用来接收表单提交的数据。
第 1 步:安装 Flask
如果你还没有安装 Flask,请先安装:
pip install Flask
第 2 步:创建项目结构
一个良好的项目结构如下:
/flask_project
|-- app.py # Flask 应用主文件
|-- /templates
|-- index.html # HTML 模板文件
第 3 步:编写 HTML 模板 (templates/index.html)
这个文件包含一个表单,action 属性指向 Flask 中处理数据的路由,method 属性指定为 POST。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">用户登录</title>
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f0f2f5; }
.container { background: white; padding: 2rem; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
input[type="text"], input[type="password"] { width: 100%; padding: 0.5rem; margin-bottom: 1rem; border: 1px solid #ccc; border-radius: 4px; }
input[type="submit"] { width: 100%; padding: 0.75rem; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
.message { color: #d9534f; margin-bottom: 1rem; }
</style>
</head>
<body>
<div class="container">
<!--
action="/login": 表单数据将被发送到 /login 这个 URL。
method="POST": 使用 HTTP POST 方法发送数据,数据不会显示在 URL 中。
-->
<form action="/login" method="POST">
<h2>用户登录</h2>
{% if message %}
<p class="message">{{ message }}</p>
{% endif %}
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="登录">
</form>
</div>
</body>
</html>
关键点:

(图片来源网络,侵删)
<form action="/login" method="POST">: 定义了表单的提交目标和方法。name="username"和name="password": 这两个字段的名字至关重要,Flask 将通过这些名字来获取数据。id属性用于 CSS 和 JavaScript,name属性用于服务器端获取数据。
第 4 步:编写 Flask 应用 (app.py)
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
# 模拟一个用户数据库
users = {
"admin": "password123"
}
@app.route('/')
def index():
# 渲染 index.html 模板
return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
# request.method 可以获取当前请求的方法 (GET 或 POST)
if request.method == 'POST':
# 1. 从 request.form 中获取表单数据
# 这是一个类似字典的对象,包含了所有 POST 提交的数据
username = request.form.get('username')
password = request.form.get('password')
# 2. 处理数据
if username in users and users[username] == password:
# 登录成功,重定向到欢迎页面
return f"<h1>欢迎, {username}!</h1>"
else:
# 登录失败,重新渲染登录页面并显示错误信息
return render_template('index.html', message="用户名或密码错误!")
# 如果是 GET 请求(例如直接访问 /login),则重定向到首页
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(debug=True)
代码解释:
from flask import ...: 导入必要的模块。request对象是核心,它包含了所有与当前 HTTP 请求相关的信息。@app.route('/login', methods=['GET', 'POST']): 这个路由可以同时处理 GET 和 POST 请求,当用户第一次访问/login时(GET 请求),我们将其重定向到首页,当表单提交时,是 POST 请求,我们在这里处理数据。if request.method == 'POST':: 判断请求方法是否为 POST。request.form.get('username'): 这是最关键的一步。request.form是一个ImmutableMultiDict对象,它包含了所有通过 POST 提交的表单数据。.get('username')方法会根据 HTML 中input的name属性来获取对应的值,使用.get()比['username']更安全,如果字段不存在,它不会抛出KeyError,而是返回None。
render_template('index.html', message="..."): 我们可以向模板传递额外的变量,这里我们将错误信息message传递给index.html,并在其中显示。
第 5 步:运行应用
在终端中,进入 flask_project 目录,运行:
python app.py
然后在浏览器中访问 http://127.0.0.1:5000,你就能看到表单并测试登录功能了。
通过 URL 查询字符串接收数据 (GET)
这种方式用于在 URL 中传递参数,例如搜索 ?q=flask 或分页 ?page=2。

(图片来源网络,侵删)
修改 Flask 应用 (app.py)
我们添加一个新的路由 /search 来演示。
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
# request.args 是一个包含所有 URL 查询字符串参数的字典
query = request.args.get('q')
page = request.args.get('page', 1, type=int) # 提供默认值 1,并指定类型为 int
if not query:
return "请提供搜索关键词, /search?q=flask"
# 模拟搜索结果
result_message = f"正在搜索: '{query}' (第 {page} 页)"
return result_message
if __name__ == '__main__':
app.run(debug=True)
代码解释:
@app.route('/search'): 这个路由只处理 GET 请求,因为 GET 是默认的请求方法。request.args.get('q'):request.args是一个包含 URL 查询字符串参数的对象,对于http://127.0.0.1:5000/search?q=flask&page=2,request.args会包含{'q': 'flask', 'page': '2'}。.get('q')获取关键词q的值。
request.args.get('page', 1, type=int):- 这是一种更强大的用法,它会尝试获取
page参数的值。 page不存在,它会使用默认值1。type=int会自动将获取到的字符串值转换为整数类型,如果转换失败(比如用户传了page=abc),它会使用默认值。
- 这是一种更强大的用法,它会尝试获取
如何测试
在浏览器中访问以下 URL:
http://127.0.0.1:5000/search?q=python-> 输出: "正在搜索: 'python' (第 1 页)"http://127.0.0.1:5000/search?q=flask&page=3-> 输出: "正在搜索: 'flask' (第 3 页)"http://127.0.0.1:5000/search-> 输出: "请提供搜索关键词, /search?q=flask"
总结与最佳实践
| 特性 | request.form (POST) |
request.args (GET) |
|---|---|---|
| 用途 | 接收 HTML <form> 提交的数据 |
接收 URL 查询字符串 (?key=value) 的数据 |
| 数据来源 | HTTP 请求体 | HTTP 请求的 URL |
| 可见性 | 数据对用户不可见 | 数据对用户可见,会显示在地址栏 |
| 大小限制 | 通常较大,受服务器配置限制 | 通常较小,有 URL 长度限制 |
| 安全性 | 更安全,适合敏感信息(如密码) | 不安全,敏感信息不应放在 URL 中 |
| Flask 访问 | request.form.get('name') |
request.args.get('name') |
重要提示:
- 永远不要信任用户输入:在处理接收到的数据前,一定要进行验证和清理,以防止安全漏洞(如 SQL 注入、跨站脚本攻击 XSS)。
- 使用 Flask-WTF:对于复杂的表单,强烈推荐使用
Flask-WTF或Flask-Werkzeug等扩展,它们提供了表单定义、数据验证、CSRF 防护等强大功能,能让你的代码更安全、更整洁。
