使用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设置cookie

    Flask中设置cookie可以通过make_response函数来实现。下面是具体的步骤: 步骤一:导入Flask和make_response from flask import Flask, make_response 步骤二:创建Flask app并定义路由 这里我们创建了一个hello函数,并将其绑定在URL路径为/的路由中。 app = Flask…

    Flask 2023年5月15日
    00
  • Django中信号signals的简单使用方法

    下面是Django中信号signals的简单使用方法: 什么是信号signals? 信号signals是Django提供的一种机制,通过该机制,某些操作的完成可以触发指定的处理函数,我们可以在这些处理函数中实现一些自己想要的操作。比如:在用户注册成功后,我们想给他发送一封欢迎电子邮件,那么我们就可以使用信号来实现这个功能。 Django中的信号signals…

    Flask 2023年5月16日
    00
  • Python 搭建Web站点之Web服务器网关接口

    下面我会详细讲解 Python 搭建 Web 站点之 Web 服务器网关接口的完整攻略,包括过程和两条示例说明。 前置知识 在学习本文之前,你需要具备以下知识: Python 的基本语法和基础知识 Web 服务器的基本原理和搭建方法 Python Web 框架的基本概念和应用 Web 服务器网关接口 WSGI 是 Web 服务器网关接口的缩写,是 Pytho…

    Flask 2023年5月15日
    00
  • Python利用Flask-Mail实现发送邮件详解

    下面是Python利用Flask-Mail实现发送邮件的完整攻略: 一、Flask-Mail简介 Flask-Mail是Flask框架的一个扩展模块,可以使发送电子邮件更方便。它提供了SMTP认证、HTML邮件等功能,使用起来十分简单。 二、安装Flask-Mail 在使用Flask-Mail之前,需要先安装Flask-Mail扩展。使用pip安装即可: p…

    Flask 2023年5月16日
    00
  • Django使用HttpResponse返回图片并显示的方法

    当我们需要在Django框架中展示一张图片或者返回一张图片时,可以使用HttpResponse将图片内容以二进制格式返回给浏览器。下面是展示如何使用HttpResponse返回图片并显示的方法的完整攻略: 方法1:读取图片文件并返回 首先在Django的视图函数中,导入以下模块: python from django.http import HttpResp…

    Flask 2023年5月16日
    00
  • 使用Flask集成bootstrap的方法

    使用Flask集成Bootstrap的方法,需要完成以下几个步骤: 安装Flask 和 Bootstrap 在终端中运行以下命令来安装Flask 和 Bootstrap: pip install Flask pip install Flask-Bootstrap 创建Flask应用 创建一个app.py文件,并编写以下代码: from flask impor…

    Flask 2023年5月16日
    00
  • 10款最好的Web开发的 Python 框架

    为了详细地讲解 “10款最好的Web开发的 Python 框架”的完整攻略,我们可以分成以下几个方面来介绍。 简介 首先,我们需要概述一下什么是Python框架。Python框架是指一套可用于Web应用程序的API(应用程序编程接口)。它们可以帮助Python开发人员更好地处理Web请求、路由URL、管理安全性、处理输入输出等应用程序功能。 Web开发常见的…

    Flask 2023年5月16日
    00
  • vue+flask实现视频合成功能(拖拽上传)

    下面是详细讲解“vue+flask实现视频合成功能(拖拽上传)”的完整攻略。 总体思路 这个项目的目的是实现用户可以通过拖拽上传多个视频文件,并将这些视频文件拼接成一个新的视频文件自定义保存,同时该视频文件可以在前端进行预览播放。 具体的实现方案是:前端使用vue框架构建视图,并使用dropzone.js插件实现文件的拖拽上传;后端使用flask框架运行py…

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