Vue中使用axios发送异步请求到Django

目录

Promise

一个构造函数,异步编程的解决方案。

let promise = new Promise(executor)

let executor = function(resolve, reject){

    resolve('结果')
    reject('失败')
}

Vue中使用axios发送异步请求到Django
promise对象的结果不能直接读取,应如下获取:
promise.then(result=>{
    console.log(result)
    }
).catch(err=>{console.log(err)})

axios

基于Promise,用于浏览器、nodejs的网络请求库
axios中文官网

axios.defaults.baseURL = 'http://127.0.0.1:8000'
axios.defaults.withCredentials = true
axios.defaults.headers['token'] = localStorage.getItem("token")||""
axios.defaults.headers['X-Requested-With'] = 'XMLHttpResquest'
axios.defaults.headers.post['Content-Type'] = 'application/json'

axios.get("xxx", {
    params:{k:v}
    headers:{k:v}
})
.then(res=>{xx})
.catch(err=>{xx})

axios.post('xx', {k:v}, {headers:{token:xxxx}}).then(res=>{}).catch(err=>{})

axios.delete("xxx", {
    params:{k:v}
    data:{k:v},
    headers:{token:xxx}
})

axios.put("xxx", {
   k:v,
}, {headers:{}})

django后端接收token及返回token:


request.headers.get("token")

res = JsonResponse({"token":xxx})

res['token'] = xxx

CORS_EXPOSE_HEADERS = (
    'token',
)

axios无法暴露响应头set-cookie,即使配置vue代理,也无法获取这个头部,只是vue可以自动存储cookie信息到浏览器。下次请求时,axios可以设置携带cookie。

Vue中使用axios发送异步请求到Django
项目根目录vue.config.js
module.exports = {
    devServer:{
        proxy:"http://127.0.0.1:8000"
    }
}

前后端不分离

使用django搭建后端,模板页面index.html
普通html页面使用axios post提交数据时,需要处理提交的数据,一般用qs库

#index.html 普通页面中使用axios
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>测试首页</title>
    <script src="/static/js/jquery.js"></script>
    <script src="/static/js/axios.js"></script>
    <script src="/static/js/vue.js"></script>
    <script src="https://cdn.bootcss.com/qs/6.7.0/qs.min.js"></script>
</head>
<body>
    <style>
        input{
            font-size: 20px;
        }
        #getSms #validateSms{
            font-size: 18px;
        }
    </style>
    <div id="container" style="text-align: center;">
        <p>测试redis存储短信验证码</p>

        <input type="text" v-model="phone" placeholder="输入手机号">
        <button id="getSms" @click="getSms">获取短信验证码</button>
        <br>
        <input type="text" v-model="smsCode" placeholder="输入验证码">
        <button id="validateSms" @click="validateSms">校验短信验证码</button>
        {% csrf_token %}
    </div>

    <script>

        axios.defaults.withCredentials = true
        axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
        axios.defaults.headers['token'] = localStorage.getItem('token') || ''

        axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
        Vue.config.productionTip = false
        new Vue({
            data(){
                return {
                    phone: "",
                    smsCode: "",
                }
            },
            methods:{
                getSms(){
                    console.log("获取短信验证码")
                    if(!this.phone){
                        alert("请输入手机号")
                        return
                    }

                    axios.get('/test_sms_code/',{params: {phone: this.phone}},
                    )
                    .then(res => {
                        console.log("响应:", res)
                        if(res.data.code == 200){
                            alert(res.data.msg + res.data.smsCode)
                        }else{
                            alert(res.data.err)
                        }
                    }).catch(err => {
                        return Promise.reject(err)
                    })

                },

                validateSms(){
                    console.log("验证短信验证码")
                    if(!this.smsCode){
                        alert("请输入短信验证码")
                        return
                    }

                    axios.post("/test_sms_code/",
                        Qs.stringify({
                            phone: this.phone,
                            smsCode: this.smsCode,
                            csrfmiddlewaretoken: $("input:last").val()
                        }), {
                            headers: {Authorization: token}
                        }).then(res => {
                        console.log("校验的响应:", res)
                        if(res.data.code==200){
                            alert(res.data.msg)
                        }else{
                            alert(res.data.err)
                        }
                    }).catch(err => {
                        return Promise.reject(err)
                    })

                },
            },
        }).$mount("#container")

    </script>

</body>
</html>

前后端分离

Vue服务中,使用axios发送请求


import axios from 'axios'

axios.defaults.baseURL = 'http://127.0.0.1:8000'

axios.defaults.withCredentials = true

axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.headers['token'] = localStorage.getItem('token')||""

axios.defaults.headers.post['Content-Type'] = 'application/json'

axios.get('/test_sms_code/',{
params: {phone: this.phone},
headers: {}
}).then(res=>{}).catch(err=>{})

axios.post("/test_sms_code/",
          {
            phone: this.phone,
            smsCode: this.smsCode,
          },
          {
            headers: {}
          }).then(res=>{}).catch(res=>{})

request({
        url: "consumers/consumers/",
        method: "get",
        params: {

          pageNo: this.pageNo,
          pageSize: this.pageSize,
        },

      })

后端Django的跨域配置


INSTALLED_APPS = [
    ...,
    'corsheaders',
    'rest_framework',
]
MIDDLEWARES = [
    'corsheaders.middleware.CorsMiddleware',
    'xxxcommonxxxx',
]

CORS_ORIGIN_WHITELIST = (
    'http://localhost:8080',
)

CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = (
    'get',
    'post',
    'put',
)

CORS_ALLOW_HEADERS = (
    'x-requested-with',
    'XMLHttpRequest',
    'token',
    'Content-Type',
)

vue脚手架导入模块

import axios from 'axios'

let axios = require('axios')

加载nodejs中的fs 模块

加载到空对象?????

let fs = require("fs")

Original: https://blog.csdn.net/weixin_45228198/article/details/122839989
Author: laufing
Title: Vue中使用axios发送异步请求到Django

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/734530/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球