Element UI+Flask前后端传参
来自CloudWiki
目录
背景
学习如何接收vue的请求并将数据返回给vue显示出来
例如:一个项目需要查数据库,大家知道前端操作不安全,所以我们需要把请求发送给python后端,python后端在处理数据并把数据发送给前端
环境准备(后端)
安装Flask
pip install flask
因为存在跨域问题,需要使用flask_cors来修饰
pip install flask-cors
Flask代码
test.py:
from flask import Flask, jsonify, abort, request from flask_cors import * app = Flask(__name__) books = [ { 'id': 1, 'title': u'论语', 'auther': u'孔子', 'price': 18 }, { 'id': 2, 'title': u'道德经', 'auther': u'老子', 'price': 15 } ] #find all books,GET操作 @app.route('/bookstore/api/v1/books', methods=['GET']) @cross_origin() def get_tasks(): return jsonify({'books': books}) #get one specific book,GET操作 @app.route('/bookstore/api/v1/books/<int:id>', methods=['GET']) def get_task(id): for book in books: if book['id']==id: return jsonify({'book': book}) abort(404) #insert a new book,POST操作 @app.route('/bookstore/api/v1/books/', methods=['POST']) def create_task(): if not request.form or not 'title' in request.form: abort(400) book = { 'id': books[-1]['id'] + 1, 'title': request.form['title'], 'auther': request.form['auther'], 'price': request.form['price'], } books.append(book) return jsonify({'book': book}), 201 #update a book,PUT操作 @app.route('/bookstore/api/v1/books/<int:id>', methods=['PUT']) def update_book(id): for book in books: if book['id']==id: book["title"] = request.form['title'] book["auther"] = request.form['auther'] book["price"] = request.form['price'] return jsonify({'books': books}) abort(400) #delete a book,DELETE操作 @app.route('/bookstore/api/v1/books/<int:id>', methods=['DELETE']) def delete_task(id): for book in books: if book['id']==id: books.remove(book) return jsonify({'result': True}) abort(404) return jsonify({'result': True}) if __name__ == '__main__': app.run(host='0.0.0.0',debug=True)
python test.py 运行这段代码 (或云服务器环境下后台运行:nohup python3 -u test.py > test.log 2>&1 &)
在浏览器输入http://127.0.0.1:5000/bookstore/api/v1/books
如果正常,会显示如下页面:
{ "books": [ { "auther": "\u5b54\u5b50", "id": 1, "price": 18, "title": "\u8bba\u8bed" }, { "auther": "\u8001\u5b50", "id": 2, "price": 15, "title": "\u9053\u5fb7\u7ecf" } ] }
Element UI
CDN版
<!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>VUE第一个案例-helloWorld</title> <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script> <!-- 引入样式 --> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <!-- 引入组件库 --> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script> </head> <body> <div id="app"> <el-container style="height: 500px; border: 1px solid #eee"> <el-aside width="200px" style="background-color: rgb(238, 241, 246)"> <el-menu :default-openeds="['1', '3']"> <el-submenu index="1"> <template slot="title"><i class="el-icon-message"></i>导航一</template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <template slot="title">选项4</template> <el-menu-item index="1-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> <el-submenu index="2"> <template slot="title"><i class="el-icon-menu"></i>导航二</template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="2-1">选项1</el-menu-item> <el-menu-item index="2-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="2-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="2-4"> <template slot="title">选项4</template> <el-menu-item index="2-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> <el-submenu index="3"> <template slot="title"><i class="el-icon-setting"></i>导航三</template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="3-1">选项1</el-menu-item> <el-menu-item index="3-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="3-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="3-4"> <template slot="title">选项4</template> <el-menu-item index="3-4-1">选项4-1</el-menu-item> </el-submenu> </el-submenu> </el-menu> </el-aside> <el-container> <el-header style="text-align: right; font-size: 12px"> <el-dropdown> <i class="el-icon-setting" style="margin-right: 15px"></i> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>查看</el-dropdown-item> <el-dropdown-item>新增</el-dropdown-item> <el-dropdown-item>删除</el-dropdown-item> </el-dropdown-menu> </el-dropdown> <span>王小虎</span> </el-header> <el-main> <el-table :data="tableData"> <el-table-column prop="auther" label="作者" width="140"> </el-table-column> <el-table-column prop="id" label="ID" width="120"> </el-table-column> <el-table-column prop="price" label="价格"> </el-table-column> <el-table-column prop="title" label="题目"> </el-table-column> </el-table> </el-main> {{tableData}} </el-container> </el-container> </div> </div> <style type="text/css"> .el-header { background-color: #B3C0D1; color: #333; line-height: 60px; } .el-aside { color: #333; } </style> <script> var Main = { data() { return { tableData: null } }, mounted () { axios .get('http://119.3.251.91:5000/bookstore/api/v1/books') .then(response => (this.tableData = response.data['books'])) .catch(function (error) { // 请求失败处理 console.log(error); }); } }; var Ctor = Vue.extend(Main) new Ctor().$mount('#app') </script> </body> </html>
模块化开发:自动加载
参考了:https://blog.csdn.net/ITarmi/article/details/108921027
首先需要命令行切换到项目文件夹使用npm安装axios
npm install axios
然后编写页面程序:
Test.vue:
<template> <div id="app"> {{ info }} </div> </template> <script> const axios = require('axios'); export default { data () { return { info: null } }, mounted () { axios .get('http://119.3.212.161:5001/product') .then(response => (this.info = response.data)) .catch(function (error) { // 请求失败处理 console.log(error); }); }, methods: { } } </script>
模块化开发:按钮触发
<template> <div id="app"> <el-button type="primary" @click="onSubmit">搜索</el-button> <div></div>{{ info }}</div> </div> </template> <script> const axios = require('axios'); export default { data () { return { info: null } }, methods: { onSubmit(){ axios .get('http://119.3.212.161:5001/product') .then(response => (this.info = response.data)) .catch(function (error) { // 请求失败处理 console.log(error); }); } } } </script>
模块化开发:按钮触发、加载数据到表格
<template> <div id="app"> <el-button type="primary" @click="onSubmit">搜索</el-button> <!-- <div></div>{{ info }}</div> --> <div> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="id" label="id" width="30"> </el-table-column> <el-table-column prop="name" label="产品名称" width="120"> </el-table-column> <el-table-column prop="one_type" label="一级类别" width="80"> </el-table-column> <el-table-column prop="two_type" label="二级类别" width="80"> </el-table-column> <el-table-column prop="price" label="价格" width="80"> </el-table-column> <el-table-column prop="company" label="公司名称" width="80"> </el-table-column> <el-table-column prop="contact" label="联系方式" width="230"> </el-table-column> <el-table-column prop="from_url" label="来源地址" width="50"> </el-table-column> <el-table-column prop="link" label="产品链接" width="200"> </el-table-column> </el-table> </div> </div> </template> <script> const axios = require('axios'); export default { data () { return { tableData: null } }, methods: { onSubmit(){ axios .get('http://119.3.212.161:5001/product') .then(response => (this.tableData = response.data['product'])) .catch(function (error) { // 请求失败处理 console.log(error); }); } } } </script>
参考文档
参考文档:https://blog.csdn.net/weixin_47597012/article/details/108092533