Flask редирект (тот же маршрут, другой метод HTTP) заканчивается 302 цикла - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь перенаправить запрос PUT на GET, и в итоге получаю 302 л oop, поскольку request.method, кажется, постоянно установлен на PUT. Я попытался добавить _method='GET' к функции url_for.

@app.route('/test', methods=['GET', 'PUT'])
def test_route():
    if request.method == 'PUT':
        ...
        return redirect(url_for('app.test_route'))
    else:
        return render_template('test.html')

В результате получилось:

[2020-02-24 04:44:06,093] INFO in _internal: 127.0.0.1 - - [24/Feb/2020 04:44:06] "PUT /test HTTP/1.1" 302 -
[2020-02-24 04:44:06,207] INFO in _internal: 127.0.0.1 - - [24/Feb/2020 04:44:06] "PUT /test HTTP/1.1" 302 -
[2020-02-24 04:44:06,331] INFO in _internal: 127.0.0.1 - - [24/Feb/2020 04:44:06] "PUT /test HTTP/1.1" 302 -
[2020-02-24 04:44:06,468] INFO in _internal: 127.0.0.1 - - [24/Feb/2020 04:44:06] "PUT /test HTTP/1.1" 302 -
[2020-02-24 04:44:06,567] INFO in _internal: 127.0.0.1 - - [24/Feb/2020 04:44:06] "PUT /test HTTP/1.1" 302 -
[2020-02-24 04:44:06,687] INFO in _internal: 127.0.0.1 - - [24/Feb/2020 04:44:06] "PUT /test HTTP/1.1" 302 -

Я искал его в StackOverflow для похожих проблем, но у меня есть не найдено ни одного рабочего решения. Кажется, что этот вопрос легко решить, но он занял у меня больше времени, чем хотелось бы.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Я нашел четкое объяснение в https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.

303 См. Другое

Ответ на запрос может быть находится под другим URI и ДОЛЖЕН быть получен с использованием метода GET для этого ресурса. Этот метод существует главным образом, чтобы позволить выводу сценария, активированного POST, перенаправить пользовательский агент на выбранный ресурс. Новый URI не является заменой ссылки на первоначально запрошенный ресурс. Ответ 303 НЕ ДОЛЖЕН кэшироваться, но ответ на второй (перенаправленный) запрос может быть кэширован.

Другой URI ДОЛЖЕН быть задан полем Location в ответе. Если метод запроса не является HEAD, объект ответа ДОЛЖЕН содержать короткую гипертекстовую заметку с гиперссылкой на новый URI.

При этом изменение кода по умолчанию 302 сделало трюк:

redirect(url_for('app.test_route'), code=303)
0 голосов
/ 24 февраля 2020

Попробуйте: url_for('test'). Я думаю, что точка делает что-то напуганное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...