当前位置:   article > 正文

Vue+Flask实现前后端分离并交互_flask vue axios 前后端分离

flask vue axios 前后端分离
  • 一个前后端分离的demo
  • 前端使用Vue框架
  • 后端使用Python的Flask
  • Vue通过使用axios获取到后端数据
  • Flask使用CORS实现跨域

完整代码

Vue代码

方法一

  • index.vue
<template>
  <el-form>
    <el-form-item>
      <el-button @click="test()">登录</el-button>
      <div>信息:{{ demo.msg }}</div>
      <div>状态码:{{ demo.status }}</div>
    </el-form-item>
  </el-form>
</template>

<script>
  import axios from 'axios'
  export default {
    name: 'Index.vue',
    data(){
      return{
        demo: ''
      }
    },
    methods: {
      test(){
        axios.post('http://127.0.0.1:5000/index')
          .then(res=>{
            // 将返回的数据显示到demo中
            this.demo = res.data;
            // 向控制台打印获取到的数据
            console.log(res.data);
          })
      },
    }
  }
</script>

<style scoped>

</style>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

方法二

  • index.vue
<template>
  <el-form>
    <el-form-item>
      <el-button @click="test()">点击</el-button>
      <div>信息:{{ demo.msg }}</div>
      <div>状态码:{{ demo.status }}</div>
    </el-form-item>
  </el-form>
</template>

<script>
  export default {
    name: 'Index.vue',
    data(){
      return{
        demo: ''
      }
    },
    methods: {
      test(){
        this.$http.post('http://127.0.0.1:5000/index')
          .then(res=>{
            // 将返回的数据显示到demo中
            this.demo = res.data;
            // 向控制台打印获取到的数据
            console.log(res.data);
          })
      },
    }
  }
</script>

<style scoped>

</style>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './plugins/element.js'
//导入字体图标
import './assets/font/iconfont.css'
// 组织显示生产模式的消息
Vue.config.productionTip = false

//==主要是这里==
import axios from 'axios'
// 挂载到vue的原型对象中
Vue.prototype.$http = axios

// 创建实例
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Flask代码

from flask import Flask, request# 跨域
from flask_cors import CORS

app = Flask(__name__)
CORS(app, supports_credentials=True)


@app.route('/index', methods=['GET', 'POST'])
def index():
    success = {
        "status": 200,
        "msg": "连接成功!"
    }
    return success

if __name__ == '__main__':
    print(app.url_map)
    app.run(debug=True)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

讲解

前端Vue代码

通过点击按钮运行test()方法,将后端返回的数据显示到demo中
<template>
  <el-form>
    <el-form-item>
      <el-button @click="test()">点击</el-button>
      <div>信息:{{ demo.msg }}</div>
      <div>状态码:{{ demo.status }}</div>
    </el-form-item>
  </el-form>
</template>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
使用axios方法获取后端返回数据
  • 返回数据为res.data
  • 后端端口为:http://127.0.0.1:5000/index
test(){
 	this.$http.post('http://127.0.0.1:5000/index')
	    .then(res=>{
			// 将返回的数据显示到demo中
			this.demo = res.data;
			// 向控制台打印获取到的数据
			console.log(res.data);
    })
},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
特别说明
  • 在上述的test()方法中,由于已经提前在main.js中导入了axios和将axios挂载到vue的原型对象中,才能使用this.$http来发送请求**(本次示例使用的发送请求方式)**。如下(main.js)
...
import axios from 'axios'
// 挂载到vue的原型对象中
Vue.prototype.$http = axios

...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 如果没有在main.js中导入axios,则可以直接在.vue文件中的<script></script>标签中导入,以下为直接在文件中导入axios并发送请求
<script>
	import axios from 'axios'
	...
	
	  test(){
        axios.post('http://127.0.0.1:5000/index')
          .then(res=>{
            // 将返回的数据显示到demo中
            this.demo = res.data;
            // 向控制台打印获取到的数据
            console.log(res.data);
          })
      },
</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

后端Flask代码

  • 创建好一个flask项目
  • app.py中,先导入跨域用的CORS库
# 跨域
from flask_cors import CORS
  • 1
  • 2
  • 配置跨域
CORS(app, supports_credentials=True)
  • 1
  • 编写路由视图
@app.route('/index', methods=['GET', 'POST'])
def index():
    success = {
        "status": 200,
        "msg": "连接成功!"
    }
    return success
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

扩展

关于CORS跨域,有两种方式:全局跨域、指定跨域接口

(1)全局跨域
  • 即上述中使用到的跨域方式
from flask import Flask, request
# 跨域
from flask_cors import CORS

app = Flask(__name__)
CORS(app, supports_credentials=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • supports_credentials是一个布尔值类型,作用:是否允许请求发送cookie,false是不允许
(2)指定跨域接口
  • 在需要进行跨域的路由视图中添加@cross_origin装饰器
from flask import Flask
from flask_cors import CORS, cross_origin
app = Flask(__name__)
 
# 只允许路径为'/index'跨域
@app.route('/index', methods=['GET', 'POST'])
def index():
    success = {
        "status": 200,
        "msg": "连接成功!"
    }
    return success
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 参考:http://t.csdn.cn/vgl7w
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号