Можно ли ограничить размер данных POST-футляра по каждому маршруту?

Я знаю, что возможно установить общий предел размера запроса в Flask с помощью:

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

НО Я хочу, чтобы один конкретный маршрут не принимал данные POST за определенный размер.

Возможно ли это?

Ответ 1

Вам нужно будет проверить это для самого конкретного маршрута; вы всегда можете проверить длину содержимого; 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 сначала проверяется перед попыткой разобрать тело запроса. С помощью декоратора или ручной проверки вы просто сделали тот же тест, но немного раньше в жизненном цикле просмотра.