python Flask methods

在 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 方法包括:

  1. GET:请求一个指定资源的表示形式。通常用于从服务器获取数据。
  2. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
  3. PUT:请求服务器存储一个资源,并用请求的主体部分来更新该资源的内容。
  4. DELETE:请求服务器删除指定的页面。
  5. HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头信息。
  6. OPTIONS:允许客户端查看服务器的性能。
  7. PATCH:对资源进行部分修改。
  8. CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
  9. 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 实现中,服务器可能会返回请求行和请求头,但通常不会返回请求体。

相关推荐
Swift社区3 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht3 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht3 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20243 小时前
Swift 数组
开发语言
stm 学习ing4 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc5 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe6 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin6 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python