Flask如何接收HTML传递的参数?

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 参数 正文
  1. 通过 HTML <form> 提交数据(POST 请求):这是最常见的方式,用于用户登录、注册、发表评论等场景。
  2. 通过 URL 查询字符串传递数据(GET 请求):用于搜索、分页等场景,数据会直接显示在 URL 中。

通过 HTML 表单接收数据 (POST)

这是处理用户输入的标准方式,我们将创建两个页面:

html 接收参数 flask
(图片来源网络,侵删)
  • 一个 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>

关键点:

html 接收参数 flask
(图片来源网络,侵删)
  • <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)

代码解释:

  1. from flask import ...: 导入必要的模块。request 对象是核心,它包含了所有与当前 HTTP 请求相关的信息。
  2. @app.route('/login', methods=['GET', 'POST']): 这个路由可以同时处理 GET 和 POST 请求,当用户第一次访问 /login 时(GET 请求),我们将其重定向到首页,当表单提交时,是 POST 请求,我们在这里处理数据。
  3. if request.method == 'POST':: 判断请求方法是否为 POST。
  4. request.form.get('username'): 这是最关键的一步
    • request.form 是一个 ImmutableMultiDict 对象,它包含了所有通过 POST 提交的表单数据。
    • .get('username') 方法会根据 HTML 中 inputname 属性来获取对应的值,使用 .get()['username'] 更安全,如果字段不存在,它不会抛出 KeyError,而是返回 None
  5. 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

html 接收参数 flask
(图片来源网络,侵删)

修改 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)

代码解释:

  1. @app.route('/search'): 这个路由只处理 GET 请求,因为 GET 是默认的请求方法。
  2. request.args.get('q'):
    • request.args 是一个包含 URL 查询字符串参数的对象,对于 http://127.0.0.1:5000/search?q=flask&page=2request.args 会包含 {'q': 'flask', 'page': '2'}
    • .get('q') 获取关键词 q 的值。
  3. 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-WTFFlask-Werkzeug 等扩展,它们提供了表单定义、数据验证、CSRF 防护等强大功能,能让你的代码更安全、更整洁。
-- 展开阅读全文 --
头像
October智能腕表,究竟有何独特之处?
« 上一篇 今天
ThinkPad X390拆机视频有何关键看点?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]