2026, Jan 09 06:02

405 Method Not Allowed в Flask при POST: почему возникает и как исправить

Разбираем ошибку 405 Method Not Allowed в Flask при отправке формы POST: почему маршрут по умолчанию принимает только GET и как указать methods=['POST'].

Столкнуться с 405 Method Not Allowed на, казалось бы, простом маршруте Flask — неприятно, особенно когда форма явно отправляет POST и конечная точка выглядит верной. Причина скрыта, но проста: по умолчанию Flask обрабатывает только GET, если вы не указали иное.

Минимальный пример, который вызывает 405

svc = Flask(__name__)
@svc.route('/')
def home():
    return render_template('index.html')
@svc.route('/submit')
def handle_submit():
    user_name = request.form.get('username')
    return f'Hello, {user_name}!'
if __name__ == '__main__':
    svc.run()

Отправка POST на /submit приводит к 405 Method Not Allowed.

Что на самом деле происходит

В Flask маршрут без явного параметра methods принимает только GET. Когда форма отправляет method="post" на /submit, Flask ищет обработчик POST для этого пути, не находит его и возвращает 405. Маршрут существует, но для нужного HTTP-метода он не зарегистрирован.

Как исправить маршрут, чтобы он принимал POST

Укажите разрешённые HTTP-методы в декораторе маршрута. В нашем случае нужен POST.

svc = Flask(__name__)
@svc.route('/')
def home():
    return render_template('index.html')
@svc.route('/submit', methods=['POST'])
def handle_submit():
    user_name = request.form.get('username')
    return f'Hello, {user_name}!'
if __name__ == '__main__':
    svc.run()

Почему это важно

В Flask работа с HTTP-методами устроена явно. Опора на значения по умолчанию легко приводит к путанице, когда форма или клиент меняют метод. Явное указание methods делает намерения понятными, предотвращает ошибки 405 и исключает случайную доступность эндпоинтов для методов, которые вы не планировали поддерживать.

Итоги

Настраивая обработку форм или API в Flask, всегда явно указывайте ожидаемые методы. Если эндпоинт принимает только данные из формы, используйте methods=['POST']. Эта небольшая правка экономит время, делает интерфейс понятнее и согласует поведение маршрута с тем, как его вызывает клиент.