Я хочу вернуть HTTP-код 201 для созданной записи, а затем перенаправить на предполагаемый маршрут.
Это не то, что вы можете сделать с HTTP. Перенаправление само по себе является спецификацией c кодом состояния HTTP 30x :
В HTTP перенаправление запускается сервером, отправляющим специальный ответ перенаправление на запрос. Ответы на перенаправление имеют коды состояния , которые начинаются с 3
, и заголовок Location
, содержащий URL-адрес для перенаправления.
Либо вы возвращаете 201 код состояния или вы возвращаете один из кодов состояния перенаправления HTTP. Вы не можете сделать и то, и другое.
Функция flask.redirect()
генерирует действительный ответ 30x (с обязательным заголовком Location
), а в документации для функции указано, какие коды состояния перенаправления поддерживаются:
Поддерживаемые коды: 301, 302, 303, 305, 307 и 308. 300 не поддерживается, потому что это не настоящее перенаправление, и 304, потому что это ответ на запрос с запросом с определенными заголовками If-Modified-Since.
Однако функция не обеспечивает этого; код состояния не подтвержден.
Здесь необходимо различать guish между браузером и другими клиентами. Ответ 201 Created - это то, что вы обычно возвращаете из REST API клиенту, который ожидает простых JSON или XML взаимодействий на программируемом уровне. С другой стороны, перенаправления чаще используются в интерфейсе на уровне представления.
Если вы кодируете интерфейс на основе HTML, просто верните перенаправление . Люди не читают коды ответов, они читают отрисованные HTML страниц. Им все равно, и им не нужно знать точные коды HTTP, используемые для того, чтобы браузер работал правильно. Учитывая, что ваш маршрут также включает форму , вы почти наверняка создаете сайт для людей, а не для программ c клиентов.
Если вы создаете REST API, верните 201 и документ, подтверждающий, что клиент API должен будет сделать новый запрос на основе включенного вами заголовка Location
или чего-то в теле ответа. Однако браузер HTML не будет следовать заголовку Location
в 201 ответе.
Тогда я бы не стал использовать для этого функцию redirect()
, даже если она позволяет вам использовать 201
в качестве код статуса, потому что он всегда создает (простое) HTML тело, содержащее текст, который вы видите в браузере об автоматическом c перенаправлении.