在这个教程中,我们将讲解如何将vue.js单页应用与Flask后端进行连接。
一般来说,如果你只是想通过Flask模板使用vue.js库也是没有问题的。但是,实际上是一个很明显的问题那就是,Jinja(模板引擎)也和Vue.js一样采用双大括号用于渲染,但只是一个还算过的去的解决方案。
我想要一个不同的例子。如果我需要建立一个单页应用程序(应用程序使用单页组成, vue-router 在HTML5的History-mode以及其他更多好用的功能)用vue.js,由Flask提供Web服务?简单地说应该这样,如下所示:
Flask为 index.html 服务, index.html 包含我的vue.js App。
在前端开发中我使用Webpack,它提供了所有很酷的功能。
Flask有API端,我可以从我的SPA访问。
我可以访问API端,甚至当我为了前端开发而运行Node.js的时候。
听起来是不是很有趣?那让我们这样动手做做吧。
完整的源代码,你可以在这里找到:https://github.com/oleg-agapov/flask-vue-spa
客户端
我将使用Vue CLI产生基本vue.js App。如果你还没有安装它,请运行:
$ npm install -g vue-cli
客户端和后端代码将被拆分到不同的文件夹。初始化前端部分运行跟踪:
$ mkdir flaskvue $ cd flaskvue $ vue init webpack frontend
通过安装向导。我的设置是:
Vue 只在运行时构建。
安装Vue-router。
使用ESLint检查代码。
选择一个ESLint 标准预设 。
不试用Karma + Mocha进行单位测试。
不使用Nightwatch建立端到端的测试。
ok,接着来:
$ cd frontend $ npm install # after installation $ npm run dev
这就可以开始安装 vue.js 应用程序。让我们从添加一些页面开始吧。
添加 home.vue 和 about.vue 到 frontend/src/components 文件夹。它们非常简单,像这样:
// Home.vue <template> <div> <p>Home page</p> </div> </template>
and
// About.vue <template> <div> <p>About</p> </div> </template>
我们将使用它们正确地识别我们当前的位置(根据地址栏)。现在我们需要改变 frontend/src/router/index.js 文件以便使用我们的新组件:
import Vue from 'vue' import Router from 'vue-router' const routerOptions = [ { path: 'https://www.jb51.net/', component: 'Home' }, { path: '/about', component: 'About' } ] const routes = routerOptions.map(route => { return { ...route, component: () => import(`@/components/${route.component}.vue`) } }) Vue.use(Router) export default new Router({ routes, mode: 'history' })
如果你试着输入 localhost:8080 和 localhost:8080/about ,你应该看到相应的页面。
我们几乎已经准备好构建一个项目,并且能够创建一个静态资源文件包。在此之前,让我们为它们重新定义一下输出目录。在 frontend/config/index.js 找到下一个设置:
index: path.resolve(__dirname, '../dist/index.html'), assetsRoot: path.resolve(__dirname, '../dist'),
把它们改为
index: path.resolve(__dirname, '../../dist/index.html'), assetsRoot: path.resolve(__dirname, '../../dist'),
所以/dist文件夹的HTML、CSS、JS会在同一级目录/frontend 。现在你可以运行 $ npm run build 创建一个包。
后端
对于Flask服务器,我将使用Python版本3.6。在 /flaskvue 创建新的子文件夹存放后端代码并初始化虚拟环境:
$ mkdir backend $ cd backend $ virtualenv -p python3 venv
为了使虚拟环境中运行(MacOS):
$ source venv/bin/activate
在Windows中需要激活此文档()。
在虚拟环境下安装:
(venv) pip install Flask
现在让我们为Flask服务端编写代码。创建根目录文件run.py:
(venv) cd .. (venv) touch run.py
向这个文件添加下一个代码:
from flask import Flask, render_template app = Flask(__name__, static_folder = "./dist/static", template_folder = "./dist") @app.route('https://www.jb51.net/') def index(): return render_template("index.html")
这段代码与Flask的 **“Hello World”**代码略有不同。主要的区别是,我们指定存储静态文件和模板位置在文件夹 /dist ,以便和我们的前端文件夹区别开。在根文件夹中运行Flask服务端:
(venv) FLASK_APP=run.py FLASK_DEBUG=1 flask run