Перенаправление на стороне сервера без вызова GET дважды

#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:

  1. fetch выполняет запрос POST на /page-1
  2. Сервер отвечает: «Вместо этого вам нужно получить page-2 «
  3. fetch следует за перенаправлением и выполняет запрос GET на /page-2
  4. Сервер отвечает содержимым page-2.html после передачи его через механизм шаблонов
  5. fetch игнорирует все, что касается ответа, кроме URL
  6. Ваш JavaScript присваивает URL-адрес location.href
  7. Браузер переходит к этому URL-адресу, делая запрос GET, чтобы получить содержимое для этого

Если вы хотите обработать данные с fetch помощью, затем вызовите метод like response.text() и обработайте ответ с помощью JavaScript.

Если вы хотите перейти на результирующую страницу, то в первую очередь используйте обычную отправку формы. Смысл fetch в том, чтобы делать HTTP-запросы, не покидая текущую страницу.