Вернуть пользовательский http-код после перенаправления в flask - PullRequest
1 голос
/ 09 июля 2020

вот я новичок в flask. Сценарий: я пытаюсь перенаправить на определенный маршрут после отправки формы. Поэтому я использую перенаправление flask для этого вместе с параметром кода.

@topics_bp.route('/create_topic/',methods =['GET','POST'] )
def create_topic():
    if request.method == 'GET':
        #send the form for create topic!
        formData = TopicForm()
        return render_template('create-topic.html',form = formData)
    if request.method == 'POST':
        # check the post method and redirect
        
        return redirect(url_for('topic.topics'),code=201)

В основном я хочу вернуть HTTP-код 201 для созданной записи, а затем перенаправить на предполагаемый маршрут. Но если мне это нравится, он просто возвращает страницу перенаправления. Каждый раз мне нужно нажимать вручную. Страница перенаправления

Есть ли обходной путь для возврата кода 201 и автоматического перенаправления? Заранее спасибо!

1 Ответ

5 голосов
/ 09 июля 2020

Я хочу вернуть 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 перенаправлении.

...