HOWTO · Flask

Flask Post 请求

我们将通过这个解释了解两种基本的 HTTP 方法(get 和 post),我们还将了解它们之间的区别,然后通过一个基本示例来说明如何从 Flask 中的基本表单发送数据。

本页内容

GET 和 POST 是请求语义不同的 HTTP 方法。使用 GET 的请求会向服务器获取资源表示,查询参数通常放在 URL 中。使用 POST 的请求会在请求正文中发送数据,表单提交时经常使用这种方式。POST 不会加密或隐藏这些数据:HTTPS 会在数据从客户端传输到服务器的过程中保护它,但客户端、服务器和任何日志系统仍可能访问这些数据。处理敏感信息时,请使用 HTTPS,并采取适当的应用层保护措施。

此示例中的路由、表单字段和读取键彼此一致。它会在 /login 提供表单;提交表单时,name 字段会发送到同一路由,Flask 再从 request.form 中读取该字段。

在 Flask 中理解 GET 和 POST

在浏览器中打开页面通常会发送 GET。如果表单提交时需要发送数据进行处理,可以使用 POST。这些方法名称说明请求的用途,并不是安全设置。查询字符串可能出现在浏览器历史记录和日志中;把值放进 POST 请求正文,本身也不能保证数据保密或避免记录。

Flask 会通过 request.method 提供收到的请求方法。一个同时处理这两种方法的路由,可以在收到 GET 时显示表单,并在收到 POST 时处理提交的值。浏览器和服务器之间仍通过同一种传输连接通信;要保护传输中的数据,需另行配置 HTTPS。

创建同时接受 GET 和 POST 的 Flask 路由

methods 参数用于告知 Flask 此路由接受哪些请求方法。在处理函数中,可根据 request.method 分支处理:收到 GET 时返回表单,收到 POST 时处理提交的数据。这样无需将表单提交到另一个端点,路由的行为也更容易理解。

构建并提交 HTML 表单

表单的 method="post" 会选择 POST;输入框的 name="name" 则会成为 Flask 用来读取值的键。表单 action 指向 /login,与下方的路由相对应。点击提交按钮即可发送表单;完成这个基本交互不需要 JavaScript。

读取提交的表单数据

对于 POST 请求,request.form.get("name", "") 会读取提交的字段;如果字段缺失,则使用默认值。将值插入 HTML 响应前,示例会先对其进行转义,因此像标记这样的文本会作为普通文字显示,而不会被当作页面标记解析。对于真实的账户操作或会更改数据的流程,还应加入适当的验证、身份验证、授权和 CSRF 防护;仅选择 POST 并不会自动提供这些保护。

运行并验证示例

在环境中使用 python -m pip install Flask 安装 Flask,将以下代码保存为 app.py,然后使用 python -m flask --app app run 启动开发服务器。随附的运行记录显示,Python 示例配置的成功用例已完成,退出码为 0,且没有标准输出;该记录没有包含浏览器请求或服务器响应。

本节中的代码以及显示的标签或输出仍为英文。

from flask import Flask, request
from markupsafe import escape

app = Flask(__name__)


@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        name = request.form.get("name", "")
        return f"<h1>Hello, {escape(name)}</h1><a href='/login'>Back</a>"

    return """<!doctype html>
<html lang="en">
  <meta charset="utf-8">
  <title>Login form</title>
  <h1>Hello, this is the login page!</h1>
  <form action="/login" method="post">
    <label>Name: <input type="text" name="name"></label>
    <button type="submit">Submit</button>
  </form>
</html>"""

打开 http://127.0.0.1:5000/login 查看表单。输入 Ada 并提交;浏览器会发送 POST,响应应显示 Hello, Ada。使用浏览器开发者工具的 Network 面板,确认初次请求使用 GET,表单提交使用 POST,并检查请求方法和表单数据。浏览器和服务器仍可看到 POST 请求正文。开发服务器仅供本地学习;部署时请使用生产环境 WSGI 服务器和 HTTPS。