使用Vue.js和Flask来构建一个单页的App的示例

下面我会详细讲解使用Vue.js和Flask来构建一个单页App的示例,包含两个示例说明。

示例1:使用Vue.js和Flask来搭建前后端分离的Todo应用

前端Vue.js

  1. 使用Vue CLI创建项目
vue create todo-vue
  1. 安装axios
npm install axios
  1. 编写Todo.vue组件
<template>
  <div>
    <h1>Todo List</h1>
    <form @submit.prevent="addTodo">
      <input type="text" v-model="newTodoText" placeholder="Add a todo">
      <button>Add</button>
    </form>
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        {{ todo.text }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      todos: [],
      newTodoText: '',
    };
  },
  methods: {
    async addTodo() {
      if (!this.newTodoText) return;
      const response = await axios.post('/api/todo', { text: this.newTodoText });
      this.todos.push(response.data);
      this.newTodoText = '';
    },
  },
  async mounted() {
    const response = await axios.get('/api/todo');
    this.todos = response.data;
  },
};
</script>

后端Flask

  1. 创建项目
mkdir todo-flask
cd todo-flask
  1. 创建虚拟环境并激活
python3 -m venv venv
source venv/bin/activate
  1. 安装Flask和Flask-CORS
pip install Flask Flask-CORS
  1. 创建Flask应用文件app.py
from flask import Flask, jsonify, request
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

todos = []

@app.route('/api/todo', methods=['GET'])
def get_todos():
    return jsonify(todos)

@app.route('/api/todo', methods=['POST'])
def add_todo():
    request_data = request.get_json()
    new_todo = {'id': len(todos) + 1, 'text': request_data['text']}
    todos.append(new_todo)
    return jsonify(new_todo)

if __name__ == '__main__':
    app.run(debug=True)
  1. 运行Flask应用
export FLASK_APP=app.py # Windows为 set FLASK_APP=app.py
flask run

将前后端连接起来

  1. 修改前端Vue.js中的axios请求地址
axios.defaults.baseURL = 'http://127.0.0.1:5000'; // Flask应用运行地址
  1. 运行前端Vue.js
npm run serve
  1. 打开浏览器,访问http://localhost:8080 就可以看到Todo应用了。

示例2:使用Vue.js和Flask来进行用户登陆认证

前端Vue.js

  1. 使用Vue CLI创建项目
vue create login-vue
  1. 安装axios和vue-router
npm install axios vue-router
  1. 编写Login.vue组件
<template>
  <div>
    <h1>Login</h1>
    <form @submit.prevent="login">
      <input type="text" v-model="username" placeholder="Username">
      <input type="password" v-model="password" placeholder="Password">
      <button>Login</button>
    </form>
    <br>
    <div v-if="errorMessage">{{ errorMessage }}</div>
  </div>
</template>

<script>
import axios from 'axios';
import { mapState } from 'vuex';

export default {
  data() {
    return {
      username: '',
      password: '',
      errorMessage: '',
    };
  },
  methods: {
    async login() {
      const data = { username: this.username, password: this.password };
      try {
        const response = await axios.post('/api/login', data);
        this.$store.commit('setToken', response.data.token);
        this.$router.push({ name: 'Home' });
      } catch (error) {
        this.errorMessage = 'Login failed, please try again!';
        console.error(error);
      }
    },
  },
  computed: mapState([
    'token',
  ]),
};
</script>
  1. 编写Home.vue组件
<template>
  <div>
    <h1>Home</h1>
    <div>{{ errorMessage }}</div>
    <div v-if="!token">Please Login to access your account!</div>
    <div v-if="token">Welcome to your account!</div>
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
  computed: mapState([
    'token',
  ]),
  data() {
    return {
      errorMessage: '',
    };
  },
  async mounted() {
    if (this.token) {
      try {
        const response = await axios.get('/api/user', {
          headers: {
            Authorization: `Bearer ${this.token}`,
          },
        });
        console.log(response.data);
      } catch (error) {
        this.errorMessage = 'Request user information failed!';
        console.error(error);
      }
    }
  },
};
</script>

后端Flask

  1. 安装Flask、Flask-CORS和Flask-JWT-Extended
pip install Flask Flask-CORS Flask-JWT-Extended
  1. 创建Flask应用文件app.py
from flask import Flask, jsonify, request
from flask_jwt_extended import create_access_token, JWTManager, jwt_required, get_jwt_identity
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
app.config['JWT_SECRET_KEY'] = 'jwt-secret-string' # 自行修改
jwt = JWTManager(app)

users = {
    'demo': {'password': 'password'},
}

@app.route('/api/login', methods=['POST'])
def login():
    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if not username or not password:
        return jsonify({"msg": "Missing username or password"}), 400
    user = users.get(username, None)
    if not user or user['password'] != password:
        return jsonify({"msg": "Invalid username or password"}), 401

    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token)

@app.route('/api/user', methods=['GET'])
@jwt_required
def get_user():
    current_user = get_jwt_identity()
    user = {'username': current_user}
    return jsonify(user)

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

将前后端连接起来

  1. 修改前端Vue.js中的axios请求地址
axios.defaults.baseURL = 'http://127.0.0.1:5000'; // Flask应用运行地址
  1. 修改/src/store/index.js文件,添加token状态和其对应的mutations
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    token: null,
  },
  mutations: {
    setToken(state, token) {
      state.token = token;
    },
  },
});
  1. 修改/src/main.js文件,添加vue-router
import Vue from 'vue';
import App from './App.vue';
import store from './store';
import VueRouter from 'vue-router';
import Home from './components/Home.vue';
import Login from './components/Login.vue';

Vue.config.productionTip = false;
Vue.use(VueRouter);

const routes = [
  { path: '/', redirect: '/home' },
  { path: '/home', name: 'Home', component: Home },
  { path: '/login', name: 'Login', component: Login },
];

const router = new VueRouter({
  routes,
});

new Vue({
  store,
  router,
  render: h => h(App),
}).$mount('#app');
  1. 运行前端Vue.js
npm run serve
  1. 运行后端Flask
export FLASK_APP=app.py # Windows为 set FLASK_APP=app.py
flask run
  1. 打开浏览器,访问http://localhost:8080 就可以看到用户登陆认证的应用了。

至此,我们就成功地使用Vue.js和Flask来构建了一个单页App和一个用户登陆认证的应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Vue.js和Flask来构建一个单页的App的示例 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Flask WTF(表单处理)扩展详解

    Flask WTF是Flask框架的一个扩展,它提供了许多方便的功能来处理表单数据。 本文将详细介绍Flask WTF的使用方法。 安装 首先,需要使用pip安装Flask WTF扩展 pip install Flask-WTF 导入 在Flask应用中,需要导入Flask-WTF模块: from flask_wtf import FlaskForm fro…

    Flask 2023年3月13日
    00
  • vue基于websocket实现智能聊天及吸附动画效果

    下面我将为您详细讲解“vue基于websocket实现智能聊天及吸附动画效果”的完整攻略,其中包含两条示例说明。 1. 实现智能聊天 1.1 安装Socket.io 首先,我们需要使用npm安装Socket.io: npm install socket.io –save 1.2 后端代码 创建后端服务器,监听WebSocket连接: // 引入socket…

    Flask 2023年5月16日
    00
  • Flask框架搭建虚拟环境的步骤分析

    下面是“Flask框架搭建虚拟环境的步骤分析”的完整攻略。 步骤1:安装虚拟环境工具 虚拟环境工具可以帮助我们在同一台机器上管理多个 Python 项目所需的不同 Python 环境、包依赖、库版本等。这里推荐使用 virtualenv 工具。 安装 virtualenv 的命令如下: pip install virtualenv 安装成功后可以验证一下: …

    Flask 2023年5月15日
    00
  • python flask解析json数据不完整的解决方法

    Python Flask解析JSON数据不完整的解决方法 在Python Flask中,我们经常需要使用JSON格式来处理数据交互。然而,在解析JSON数据时有时会出现数据不完整的情况,可能会导致程序出错。在本篇文章中,我们将学习如何解析JSON数据不完整的问题,并给出两个示例进行说明。 解析JSON数据不完整的原因 在使用Python Flask框架解析J…

    Flask 2023年5月16日
    00
  • 基于React-Dropzone开发上传组件功能(实例演示)

    下面详细讲解一下“基于React-Dropzone开发上传组件功能(实例演示)”的完整攻略。 一、React-Dropzone 简单介绍 React-Dropzone 是一个开源的 React 组件,可以帮助我们在 React 项目中快速构建一个上传文件的功能。它支持拖拽上传,以及点击上传,同时还支持多种类型的文件上传,包括图片、文档、音频、视频等。 二、安…

    Flask 2023年5月16日
    00
  • python实现通过flask和前端进行数据收发

    实现通过Flask和前端进行数据收发的过程大致可以分为以下几个步骤: 1. 安装Flask框架 首先需要安装Flask框架,可以通过pip命令进行安装: pip install Flask 2. 编写后端Flask应用 编写一个简单的Flask应用,实现接收前端数据,处理数据并返回结果。以下是一个示例代码: from flask import Flask, …

    Flask 2023年5月15日
    00
  • bootstrap flask登录页面编写实例

    下面将为您详细讲解“Bootstrap Flask登录页面编写实例”的完整攻略。 示例一:使用Flask-Login插件实现登录功能 首先,我们需要在Flask应用程序中安装Flask-Login插件,可以在终端中使用以下命令进行安装: pip install flask-login 接着,在Flask应用程序的文件中导入Flask-Login插件,并使用它…

    Flask 2023年5月15日
    00
  • Vue和Flask通信的实现

    下面是“Vue和Flask通信的实现”的完整攻略: 1. 前言 Vue是前端框架,Flask是后端框架,在面对复杂的前后端交互时,Vue和Flask的相互通信尤为重要。本攻略将介绍如何使用Vue和Flask进行通信,并提供两个示例说明。 2. 基本步骤 Vue和Flask通信的基本步骤如下: 在Flask中定义路由和接口 在Vue中调用Flask接口 在Vu…

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部