Почему существует 2 выполнения POST, когда я отправляю их только один раз? Vue 3 Composition API, Django REST JWT

#javascript #vue.js #django-rest-framework

#javascript #vue.js #django-rest-framework

Вопрос:

Итак, после отправки успешного POST-запроса с помощью axios в Django rest API для токенов я получаю ответ 200 с токенами обновления и доступа, которые хранятся в локальном хранилище. Проблема в том, что есть второй POST-запрос, который также успешно выполняется на вкладке сеть. Почему есть 2 запроса POST, когда я отправляю форму только один раз?

 <template>
  <div>
    auth 1
    <div id="authenticationDiv">
      <form action="" v-on:submit.prevent="loginUser(username, password)">
        <!-- <input type="text" v-model="username" /> -->
        <!-- <input type="text" v-model="password" /> -->
        <button @click="loginUser(username, password)">
          login
        </button>
      </form>
    </div>
    <div></div>
  </div>
</template>

<script>
import { ref } from "vue";
import axios from "axios";

export default {
  setup() {
    const username = ref("aleksisDjango");
    const password = ref("zimbabwe123");

    const ACCESS_TOKEN = "access_token";
    const REFRESH_TOKEN = "refresh_token";

    const TOKEN_URL = "http://127.0.0.1:8000/api/token/";

    const tokenRequest = axios.create({
      baseURL: TOKEN_URL,
      timeout: 5000,
      headers: {
        "Content-Type": "application/json",
        accept: "application/json",
      },
    });

    const loginUser = (username, password) => {
      const loginBody = { username, password };
      return tokenRequest
        .post("http://127.0.0.1:8000/api/token/", loginBody)
        .then((response) => {
          window.localStorage.setItem(ACCESS_TOKEN, response.data.access);
          window.localStorage.setItem(REFRESH_TOKEN, response.data.refresh);
          // console.log(response.data)
          console.log("done");
          // this line is executed twice in the command line
          return Promise.resolve(response.data);
        })
        .catch((error) => {
          console.log(error);
          return Promise.reject(error);
        });
    };

    return {
      username,
      password,
      loginUser,
    };
  },
};
</script>

<style scoped>
#authenticationDiv {
  margin: 20px 50px;
}
</style>
  

Ответ №1:

Ваша проблема здесь:

 <form action="" v-on:submit.prevent="loginUser(username, password)">
        <!-- <input type="text" v-model="username" /> -->
        <!-- <input type="text" v-model="password" /> -->
        <button @click="loginUser(username, password)">
          login
        </button>
      </form>
  

Вы делаете запрос, когда нажимаете кнопку button , и другой запрос, когда форма отправлена. Для решения проблемы либо:

 <form action="" v-on:submit.prevent="loginUser(username, password)">
        <!-- <input type="text" v-model="username" /> -->
        <!-- <input type="text" v-model="password" /> -->
        <button>
          login
        </button>
      </form>
  

Или

 <form action="#">
        <!-- <input type="text" v-model="username" /> -->
        <!-- <input type="text" v-model="password" /> -->
        <button @click="loginUser(username, password)">
          login
        </button>
      </form>