#javascript #redirect #fetch
#javascript #перенаправление #принести
Вопрос:
Я пытаюсь реализовать то, что в основном представляет собой многоступенчатую форму: отправьте страницу 1 с запросом POST, затем перенаправьте пользователя на страницу 2 формы. Это приводит к созданию двух запросов GET (один fetch
и один document
GET, с учетом сетевых запросов), что, я не уверен, правильно. Почему первоначальный запрос GET не просто получает HTML-страницу, которая должна быть отображена (ответ на fetch
запрос пустой)? Должно ли на самом деле быть два запроса в правильном шаблоне для этого, или я понимаю, как перенаправления должны работать не совсем правильно?
Клиентский код:
fetch("/page-1", {
method: "POST",
redirect: "follow",
<...other params here>
}).then(resp => {
window.location.href = resp.url;
})
Код сервера Flask:
@app.route("/page-1", methods=["GET", "POST"]
def page_1():
if request.method == "POST":
# save page 1 data here
return redirect(url_for("page-2", _scheme="https", _external=True))
if request.method == "GET":
return render_template("page-1.html")
@app.route("/page-2", methods=["GET", "POST"]
def page_2():
if request.method == "POST":
# save page 2 data here
if request.method == "GET":
# **this code path is called twice every time the user navigates page 1->2
return render_template("page-2.html")
Комментарии:
1. Похоже, вы могли бы просто использовать действие html-формы и не использовать JS. Это позволило бы обработать сообщение и перенаправление за одно действие.
Ответ №1:
fetch
выполняет запрос POST на/page-1
- Сервер отвечает: «Вместо этого вам нужно получить
page-2
« fetch
следует за перенаправлением и выполняет запрос GET на/page-2
- Сервер отвечает содержимым
page-2.html
после передачи его через механизм шаблонов fetch
игнорирует все, что касается ответа, кроме URL- Ваш JavaScript присваивает URL-адрес
location.href
- Браузер переходит к этому URL-адресу, делая запрос GET, чтобы получить содержимое для этого
Если вы хотите обработать данные с fetch
помощью, затем вызовите метод like response.text()
и обработайте ответ с помощью JavaScript.
Если вы хотите перейти на результирующую страницу, то в первую очередь используйте обычную отправку формы. Смысл fetch
в том, чтобы делать HTTP-запросы, не покидая текущую страницу.