在 Flask 中,@app.route()
装饰器用于定义 URL 路由和与之关联的视图函数。当你想指定某个 URL 可以接受哪些 HTTP 方法时,你可以使用 methods
参数。methods
是一个列表,它可以包含任何有效的 HTTP 方法。
Falsk文章中的描述:
链接:https://flask.palletsprojects.com/en/3.0.x/patterns/methodoverrides/
python
class HTTPMethodOverrideMiddleware(object):
allowed_methods = frozenset([
'GET',
'HEAD',
'POST',
'DELETE',
'PUT',
'PATCH',
'OPTIONS'
])
bodyless_methods = frozenset(['GET', 'HEAD', 'OPTIONS', 'DELETE'])
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
method = environ.get('HTTP_X_HTTP_METHOD_OVERRIDE', '').upper()
if method in self.allowed_methods:
environ['REQUEST_METHOD'] = method
if method in self.bodyless_methods:
environ['CONTENT_LENGTH'] = '0'
return self.app(environ, start_response)
常见的 HTTP 方法包括:
GET
:请求一个指定资源的表示形式。通常用于从服务器获取数据。POST
:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。PUT
:请求服务器存储一个资源,并用请求的主体部分来更新该资源的内容。DELETE
:请求服务器删除指定的页面。HEAD
:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头信息。OPTIONS
:允许客户端查看服务器的性能。PATCH
:对资源进行部分修改。CONNECT
:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。TRACE
:回显服务器收到的请求,主要用于测试或诊断。
在 Flask 中,你可以这样指定 methods
:
python
from flask import Flask
app = Flask(__name__)
@app.route('/example', methods=['GET', 'POST'])
def example():
if request.method == 'GET':
return "You're making a GET request"
elif request.method == 'POST':
return "You're making a POST request"
if __name__ == '__main__':
app.run()
在这个例子中,/example
URL 既可以接受 GET 请求,也可以接受 POST 请求。视图函数 example()
会根据请求的方法返回不同的响应。
GET 请求
GET 请求通常用于从服务器检索数据。
python
from flask import Flask, request
app = Flask(__name__)
@app.route('/get_example', methods=['GET'])
def get_example():
return "You've made a GET request to this URL."
if __name__ == '__main__':
app.run(debug=True)
POST 请求
POST 请求通常用于向服务器提交数据,如表单数据。
python
from flask import Flask, request
app = Flask(__name__)
@app.route('/post_example', methods=['POST'])
def post_example():
data = request.form # 假设数据是表单数据
name = data.get('name')
return f"You've posted {name}!"
if __name__ == '__main__':
app.run(debug=True)
PUT 请求
PUT 请求通常用于更新服务器上的资源。
python
from flask import Flask, request, jsonify
app = Flask(__name__)
# 假设我们有一个存储用户数据的字典
users = {}
@app.route('/put_example/<int:user_id>', methods=['PUT'])
def put_example(user_id):
data = request.get_json() # 假设数据是 JSON 格式
users[user_id] = data
return jsonify({"message": f"User {user_id} has been updated."}), 200
if __name__ == '__main__':
app.run(debug=True)
DELETE 请求
DELETE 请求通常用于删除服务器上的资源。
python
from flask import Flask, request, jsonify
app = Flask(__name__)
# 假设我们有一个存储用户数据的字典
users = {1: {'name': 'John', 'age': 30}}
@app.route('/delete_example/<int:user_id>', methods=['DELETE'])
def delete_example(user_id):
if user_id in users:
del users[user_id]
return jsonify({"message": f"User {user_id} has been deleted."}), 200
else:
return jsonify({"error": f"User {user_id} does not exist."}), 404
if __name__ == '__main__':
app.run(debug=True)
HEAD 请求
HEAD 请求与 GET 请求类似,但服务器只返回响应头,而不返回响应体。
python
from flask import Flask
app = Flask(__name__)
@app.route('/head_example', methods=['HEAD'])
def head_example():
# Flask 默认会处理 HEAD 请求,类似于 GET 请求但只返回头
return "", 200
if __name__ == '__main__':
app.run(debug=True)
注意:Flask 默认会自动处理 HEAD 请求,如果相应的 GET 路由存在,则 HEAD 请求会返回相同的响应头但没有响应体。
PATCH 请求
PATCH 请求用于对资源进行部分更新。
python
from flask import Flask, request, jsonify
app = Flask(__name__)
# 假设我们有一个存储用户数据的字典
users = {1: {'name': 'John', 'age': 30}}
@app.route('/patch_example/<int:user_id>', methods=['PATCH'])
def patch_example(user_id):
if user_id in users:
data = request.get_json() # 假设数据是 JSON 格式
users[user_id].update(data) # 部分更新用户数据
return jsonify({"message": f"User {user_id} has been partially updated."}), 200
else:
return jsonify({"error": f"User {user_id} does not exist."}), 404
if __name__ == '__main__':
app.run(debug=True)
CONNECT 方法
CONNECT
方法通常用于建立到由目标资源标识的服务器的隧道连接。这主要用于通过代理服务器发送加密的 HTTPS 请求。因为 HTTPS 的通信内容在传输前是加密的,所以代理服务器无法直接读取或修改请求/响应的内容。通过使用 CONNECT
方法,客户端可以告诉代理服务器它想要建立一个到目标服务器的隧道,然后代理服务器会将客户端的请求直接转发到目标服务器,而不对其进行任何修改。
在 Flask 中,通常不直接处理 CONNECT
请求,因为这涉及到网络层面的底层操作。但是,如果你正在编写一个代理服务器,并且希望用 Flask 来处理非 CONNECT
类型的请求,你可以忽略 CONNECT
请求,或者将其转发到另一个处理 CONNECT
请求的组件。
TRACE 方法
TRACE
方法允许客户端发起一个请求到服务器,服务器会将收到的请求(包括请求头和请求体)原样返回给客户端。这主要用于测试或诊断,以查看请求在传输过程中是否被修改或添加了额外的头信息。
在 Flask 中,你可以通过编写一个处理 TRACE
请求的视图函数来演示这个功能:
python
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/trace_example', methods=['TRACE'])
def trace_example():
# 将请求头和请求体(如果有的话)返回给客户端
headers = {key: value for key, value in request.headers.items()}
# 注意:出于安全考虑,通常不会返回请求体,因为它可能包含敏感信息
# 这里我们假设没有请求体,或者我们不返回它
return jsonify({"headers": headers, "message": "TRACE request received."}), 200
if __name__ == '__main__':
app.run(debug=True)
请注意,由于安全和隐私的原因,许多服务器和代理可能会限制或禁止 TRACE
请求。此外,由于 Flask 默认不处理请求体(对于 TRACE
请求来说通常也没有请求体),上面的示例中没有处理请求体。在真实的 TRACE
实现中,服务器可能会返回请求行和请求头,但通常不会返回请求体。