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

yizhihongxing

下面我会详细讲解使用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日

相关文章

  • 深入理解python中的ThreadLocal

    深入理解Python中的ThreadLocal 什么是ThreadLocal ThreadLocal是Python中的threading模块提供的一种线程本地存储方式,它可以让每个线程都拥有独立的数据副本,保证了线程之间的数据互相隔离,不会相互干扰。 在多线程处理共享数据时,为了避免并发访问带来的问题,我们通常会采用锁的方式来保护共享数据。但是在使用Thre…

    Flask 2023年5月15日
    00
  • Python的Flask项目中获取请求用户IP地址 addr问题

    Sure!获取请求用户的IP地址是一个常见的需求,在Flask项目中也是如此。下面我将会详细讲解如何在Flask项目中获取请求用户IP地址,包含两个示例说明,一步一步介绍如何实现。 方法一:从Flask请求对象中获取IP地址 在Flask项目中获取用户IP地址是非常简单的,你只需要从Flask请求对象中获取即可。以下是一个示例代码片段: from flask…

    Flask 2023年5月16日
    00
  • Python Flask入门之模板

    下面是Python Flask入门之模板的完整攻略: 1. 概述 Python Flask是一种轻量级的Web框架,提供了非常简单的方式来构建Web应用程序。在Flask中,模板是用来定义页面布局、数据展示和用户输入的一种方法。通过使用模板,可以在不同的页面中嵌入一些公共的HTML代码、样式等。本文将是一个Python Flask模板入门教程。 2. 准备工…

    Flask 2023年5月15日
    00
  • Linux中使用top命令的技巧

    下面是“Linux中使用top命令的技巧”的完整攻略。 一、什么是top命令 top命令是一款常用的系统监控工具,可以实时查看系统的资源占用情况,包括进程占用的CPU、内存等。 二、top命令的参数和用法 top命令的常用参数如下: -d:指定刷新时间,默认为3秒; -p:指定监控的进程PID; -u:指定监控的用户; -H:显示进程的线程; -i:不显示I…

    Flask 2023年5月15日
    00
  • Flask使用SQLAlchemy实现持久化数据

    当我们需要在Flask应用中使用关系型数据库,SQLAlchemy是一款功能强大,易于使用的Python ORM框架。在此,我将介绍如何在Flask应用中使用SQLAlchemy实现持久化数据。 步骤1:安装依赖 在开始前,我们需要安装依赖。在终端中执行以下命令安装依赖: pip install flask sqlalchemy 步骤2:创建Flask应用 …

    Flask 2023年5月16日
    00
  • 哪些是python中web开发框架

    在Python中,有许多不同的Web框架可供选择。以下是其中一些最受欢迎和最流行的框架。 Flask:Flask是一个轻量级的Web应用程序框架,它是构建Web应用程序非常简单的框架之一。 Flask是使用Python并遵循Python哲学的核心原则之一:简单性。许多高度使用的Web应用程序都使用Flask,例如Pinterest,LinkedIn等。 Dj…

    Flask 2023年5月15日
    00
  • 爬虫训练前端基础Bootstrap5排版表格图像

    下面是爬虫训练前端基础Bootstrap5排版表格图像的完整攻略,这里会包含两条示例说明。 Bootstrap5简介 Bootstrap是一套开源工具集,其中包括用于快速应用程序开发的HTML、CSS和JavaScript的框架。Bootstrap由Twitter的Mark Otto和Jacob Thornton在2010年兴起,是目前最受欢迎的前端框架之一…

    Flask 2023年5月16日
    00
  • Dockerfile构建一个Python Flask 镜像

    Docker 是一款划时代的容器化技术,在使用它的时候,我们会经常需要构建一个自己的 Docker 镜像,下面,我将详细讲解在 Docker 中如何构建一个 Python Flask 镜像。 1. 准备工作: 首先,我们需要在本地安装 Docker 和 Python 环境,如果你的电脑上没有安装,建议使用 Docker Desktop,和官方 Python …

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