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']. Эта небольшая правка экономит время, делает интерфейс понятнее и согласует поведение маршрута с тем, как его вызывает клиент.