在现代Web开发中,前端和后端分离的架构越来越流行。Vue 3作为一款流行的前端框架,提供了强大的组件化开发能力;而Flask作为一个轻量级的Python Web框架,能够快速搭建后端服务。将Vue 3与Flask集成在一起,可以实现一个高效的全栈开发流程。本文将深入探讨如何将Vue 3与Flask集成,构建一个轻量级的全栈应用。
Vue 3是Vue.js的最新版本,引入了许多新特性,例如Composition API、响应式系统优化等。它使得开发者能够更灵活地组织代码逻辑,并且提高了性能。
Flask是一个基于Python的微框架,具有简单易用的特点,适合快速开发小型到中型的应用程序。它支持RESTful请求处理,非常适合与前端框架结合使用。
首先,创建一个基本的Flask项目。确保安装了Python环境和pip包管理工具。
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装Flask
pip install flask
接下来,创建一个简单的Flask应用 app.py
:
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api/data', methods=['GET'])
def get_data():
return jsonify({"message": "Hello from Flask!"})
if __name__ == '__main__':
app.run(debug=True)
运行Flask应用:
python app.py
此时,访问 http://localhost:5000/api/data
将返回JSON数据。
使用Vue CLI或Vite创建Vue 3项目。
# 使用Vite创建Vue 3项目
npm init vite@latest my-vue-app --template vue
cd my-vue-app
npm install
启动Vue开发服务器:
npm run dev
默认情况下,Vue开发服务器会运行在 http://localhost:3000
。
在Vue 3组件中,可以通过Axios库来调用Flask后端API。
安装Axios:
npm install axios
在Vue组件中编写代码:
<template>
<div>
<h1>{{ message }}</h1>
</div>
</template>
<script>
import { ref, onMounted } from 'vue';
import axios from 'axios';
export default {
setup() {
const message = ref('');
onMounted(async () => {
try {
const response = await axios.get('http://localhost:5000/api/data');
message.value = response.data.message;
} catch (error) {
console.error(error);
}
});
return { message };
}
};
</script>
由于Vue开发服务器和Flask后端运行在不同的端口上,可能会遇到CORS(跨域资源共享)问题。为了解决这个问题,可以在Flask中启用CORS支持。
安装Flask-CORS扩展:
pip install flask-cors
修改 app.py
文件:
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route('/api/data', methods=['GET'])
def get_data():
return jsonify({"message": "Hello from Flask!"})
重新启动Flask应用即可解决跨域问题。
在生产环境中,需要将Vue 3构建后的静态文件与Flask后端整合。首先,在Vue项目中生成生产环境的静态文件:
npm run build
这将在 dist
目录下生成静态文件。然后,修改Flask应用以服务这些静态文件。
from flask import Flask, jsonify, send_from_directory
app = Flask(__name__, static_folder='../my-vue-app/dist')
@app.route('/')
def index():
return app.send_static_file('index.html')
@app.route('/<path:path>')
def static_proxy(path):
return app.send_static_file(path)
@app.route('/api/data', methods=['GET'])
def get_data():
return jsonify({"message": "Hello from Flask!"})
这样,Flask既可以提供API接口,也可以服务Vue的静态文件。
sequenceDiagram participant Browser as User Browser participant Vue as Vue Frontend participant Flask as Flask Backend Browser->>Vue: Request Data Vue->>Flask: GET /api/data Flask-->>Vue: JSON Response Vue-->>Browser: Update UI