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 实现中,服务器可能会返回请求行和请求头,但通常不会返回请求体。

相关推荐
木觞清28 分钟前
Django学习第三天
python·学习·django
电饭叔33 分钟前
《python程序语言设计》2018版第5章第52题利用turtle绘制sin函数
开发语言·python
weixin_4526006934 分钟前
如何为老化的汽车铅酸电池充电
开发语言·单片机·安全·汽车·电机·电源模块·充电桩
Java资深爱好者1 小时前
如何在std::map中查找元素
开发语言·c++
YCCX_XFF212 小时前
ImportError: DLL load failed while importing _imaging: 操作系统无法运行 %1
开发语言·python
哥廷根数学学派3 小时前
基于Maximin的异常检测方法(MATLAB)
开发语言·人工智能·深度学习·机器学习
FutureUniant3 小时前
GitHub每日最火火火项目(7.7)
python·计算机视觉·ai·github·视频
杰哥在此4 小时前
Java面试题:讨论持续集成/持续部署的重要性,并描述如何在项目中实施CI/CD流程
java·开发语言·python·面试·编程
Unity打怪升级4 小时前
Laravel: 优雅构建PHP应用的现代框架
开发语言·php·laravel
C.C4 小时前
java IO流(1)
java·开发语言