是否可以按路由限制Flask POST数据大小?

24 投票
1 回答
22423 浏览
提问于 2025-04-18 15:19

我知道在Flask中可以通过设置一个整体的请求大小限制,来限制请求的大小:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

但是我想确保某个特定的路由(也就是特定的链接)不会接受超过某个大小的POST数据。

这可能吗?

1 个回答

45

你需要检查特定的路由;你可以随时测试内容的长度;request.content_length 可能是 None 或者一个整数值:

cl = request.content_length
if cl is not None and cl > 3 * 1024 * 1024:
    abort(413)

在访问请求中的表单或文件数据之前,先做这个检查。

你可以把这个做成一个装饰器,用在你的视图函数上:

from functools import wraps
from flask import request, abort


def limit_content_length(max_length):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            cl = request.content_length
            if cl is not None and cl > max_length:
                abort(413)
            return f(*args, **kwargs)
        return wrapper
    return decorator

然后可以这样使用:

@app.route('/...')
@limit_content_length(3 * 1024 * 1024)
def your_view():
    # ...

这基本上就是 Flask 的做法;当你尝试访问请求数据时,它会先检查 Content-Length 这个头信息,然后再解析请求的内容。通过你刚才做的装饰器或手动检查,你只是把这个测试提前了一点,在视图的生命周期中更早地进行。

撰写回答