Skip to content

Flask - HTTP 方法

超文本传输协议(HTTP,HyperText Transfer Protocol)是万维网(World Wide Web)上数据通信的基础。它定义了一组请求方法(Request Methods,常被称为“HTTP 动词”或“HTTP verbs”),用于指示针对给定资源(由 URL 标识)要执行的期望操作。

常见 HTTP 方法:

序号方法描述
1GET请求检索由 Request-URI 标识的信息。应仅用于获取数据,不应产生其他副作用。这是浏览网页时最常用的方法。
2POST将数据提交到由 Request-URI 标识的资源进行处理(例如,提交网页表单、上传文件)。通常会导致服务器上的状态改变或产生副作用。
3PUT用请求负载完全替换目标资源的当前所有表示。常用于完全更新现有资源。
4DELETE请求源服务器删除由 Request-URI 标识的资源。
5HEAD与 GET 完全相同,但服务器在响应中绝不能返回消息体。可用于获取资源的元信息而无需传输完整内容。
6OPTIONS请求有关目标资源可用通信选项的信息(例如,支持哪些 HTTP 方法)。
7PATCH对资源进行部分修改。与 PUT 不同,它只更新指定的字段。

默认情况下,Flask 路由仅响应 GET 请求(并隐式响应 HEAD 和 OPTIONS)。要让路由处理其他方法,您必须在使用 @app.route() 装饰器时,通过 methods 参数明确列出它们。

示例:处理登录表单的 GET 和 POST 请求

Section titled “示例:处理登录表单的 GET 和 POST 请求”

此示例演示了如何通过单个 URL (/login) 在使用 GET 访问时显示表单,并在使用 POST 访问时处理提交的表单数据。

  1. 在您的 templates 文件夹中创建名为 login_page.html 的 HTML 模板文件:
<!DOCTYPE html>
<html>
<head>
<title>Login Example</title>
</head>
<body>
<h1>Login Form</h1>
<form action="{{ url_for('handle_login') }}" method="post">
<p>Enter Name: <input type="text" name="username"></p>
<p><input type="submit" value="Submit"></p>
</form>
</body>
</html>

注意 <form> 标签中的 method="post"。

  1. 创建 Flask 应用脚本 (app.py 文件):
from flask import Flask, redirect, url_for, request, render_template
app = Flask(__name__)
# 成功登录的路由
@app.route('/success/<name>')
def login_success(name):
return f'Welcome {name}!'
# 处理显示表单 (GET) 和处理表单提交 (POST) 的路由
@app.route('/login', methods=['POST', 'GET'])
def handle_login():
if request.method == 'POST':
# 请求是 POST:访问提交的表单数据
user_name = request.form['username'] # 使用输入的 'name' 属性访问数据
# 重定向到成功页面,传递用户名
return redirect(url_for('login_success', name=user_name))
else:
# 请求是 GET:显示登录表单模板
return render_template('login_page.html')
if __name__ == '__main__':
app.run(debug=True)

解释:

  • methods=['POST', 'GET']:这明确允许 /login 路由处理 POST 和 GET 请求。
  • request.method:在 handle_login 函数内部,我们检查当前请求的方法。
  • 如果 request.method == 'POST':当表单提交时执行此代码块。我们从 request.form(它包含请求体中提交的表单数据)中检索名为 username 的输入字段的值。然后,我们使用 url_for 构建 URL 并传递提取的 user_name,将用户重定向到 login_success 路由。
  • 如果 request.method == 'GET'(else 块):当用户首次导航到 /login 时执行此代码块。我们渲染 login_page.html 模板以显示表单。
  • request.args:如果数据是通过 URL 查询字符串发送的(例如 /search?term=flask),您将使用 request.args.get('term') 来访问它。这通常用于 GET 请求。

运行示例:

  1. 保存文件并运行 python app.py。

  2. 打开浏览器并访问 http://127.0.0.1:5000/login。您将看到登录表单(由 GET 请求处理)。

  3. 输入姓名(例如“Alice”)并点击 Submit(提交)。

交互描述:

浏览器将一个 POST 请求发送到 /login,其中包含您在表单数据中输入的姓名。Flask 将此请求路由到 handle_login()。if request.method == 'POST' 代码块执行,从 request.form['username'] 中检索到“Alice”,并生成一个重定向响应到 /success/Alice。浏览器接收到此重定向并向 /success/Alice 发起一个新的 GET 请求。Flask 将此请求路由到 login_success(name='Alice'),该函数返回“Welcome Alice!”消息。