午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

使用 Vue.js 和 Flask 實(shí)現(xiàn)全棧單頁(yè)面應(yīng)用

 達(dá)坂城大豆 2017-11-14


譯者:楓林 

鏈接:http://www./article/4491 

原文:https:///full-stack-single-page-application-with-vue-js-and-flask-b1e036315532

在本教程中,我將向大家展示如何使用前端的 Vue.js 單頁(yè)面應(yīng)用和后端的 Flask 進(jìn)行交互。

如果你只是想使用 Vue.js 庫(kù)和 Flask 模板基本上是沒(méi)什么問(wèn)題的。但...好吧,其實(shí)還是有一個(gè)比較顯而易見(jiàn)的問(wèn)題:跟 Vue.js 一樣,Jinji(模板引擎)也是使用雙大括號(hào)來(lái)渲染頁(yè)面,但已經(jīng)有一個(gè)很好的解決方案 在這里 了。

我想要一個(gè)跟上面方案有點(diǎn)不同的例子。如果我要一個(gè)用 Vue.js(使用單頁(yè)面組件,在 vue-router 開(kāi)啟 HTML5 history 模式,還有使用其他一些非常棒的特性)框架的單頁(yè)面和 Flask 做后臺(tái)服務(wù)的應(yīng)用?應(yīng)該能按下面的要求工作:

  • Flask運(yùn)行的服務(wù)可以訪問(wèn) index.html 首頁(yè)和 Vue.js 應(yīng)用

  • 在前端開(kāi)發(fā)環(huán)境,使用 Webpack 和它提供的很多非常棒的功能

  • 可以從前端的單頁(yè)面應(yīng)用訪問(wèn) Flask 的 API 接口

  • 以 Node.js 服務(wù)運(yùn)行的前端開(kāi)發(fā)環(huán)境同樣也可以訪問(wèn) API 接口

這看起來(lái)很有趣,不是嗎?那就讓我們開(kāi)始吧。

你可以在github上查看所有的源代碼:

https://github.com/oleg-agapov/flask-vue-spa

客戶(hù)端

我用 vue-cli 命令行工具搭建起 Vue.js 的基礎(chǔ)框架。如果你還沒(méi)有安裝,可以運(yùn)行:

  1. $ npm install -g vue-cli

客戶(hù)端和后端代碼將會(huì)放到不同的文件夾下,初始化前端部分執(zhí)行如下操作:

  1. $ mkdir flaskvue

  2. $ cd flaskvue

  3. $ vue init webpack frontend

以下是我通過(guò)安裝向?qū)У捻?xiàng)目設(shè)置:

  • Vue build?—?Runtime only (Vue 構(gòu)建的版本 - 運(yùn)行時(shí))

  • Install vue-router??—?Yes (安裝 vue-router? - 是)

  • Use ESLint to lint your code??—?Yes (使用 ESLint 校驗(yàn)?zāi)愕拇a? - 是)

  • Pick an ESLint preset?—?Standard (選擇 ESList 的預(yù)置版本 - 標(biāo)準(zhǔn))

  • Setup unit tests with Karma + Mocha??—?No (使用 Karma + Mocha 設(shè)置單元測(cè)試? - 否)

  • Setup e2e tests with Nightwatch??—?No (使用 Nightwatch 設(shè)置端到端測(cè)試? - 否)

下一步:

  1. $ cd frontend

  2. $ npm install

  1. # after installation

  2. $ npm run dev

現(xiàn)在你可以開(kāi)始設(shè)置 Vue.js 應(yīng)用了。讓我們先來(lái)添加些頁(yè)面吧。

添加 Home.vue 和 About.vue 到 frontend/src/components 文件夾。像如下簡(jiǎn)單添加些內(nèi)容:

  1. // Home.vue

  2.  

  3.    

    Home pagep>

  4.  div>

  5. template>

  1. // About.vue

  2.  

  3.    

    Aboutp>

  4.  div>

  5. template>

我們將在本地驗(yàn)證它們(通過(guò)地址欄訪問(wèn))?,F(xiàn)在我們要改變 frontend/src/router/index.js 文件去一個(gè)個(gè)渲染我們的新組件:

  1. import Vue from 'vue'

  2. import Router from 'vue-router'

  3. const routerOptions = [

  4.  { path: '/', component: 'Home' },

  5.  { path: '/about', component: 'About' }

  6. ]

  7. const routes = routerOptions.map(route => {

  8.  return {

  9.    ...route,

  10.    component: () => import(`@/components/${route.component}.vue`)

  11.  }

  12. })

  13. Vue.use(Router)

  14. export default new Router({

  15.  routes,

  16.  mode: 'history'

  17. })

現(xiàn)在如果輸入 localhost:8080 和 localhost:8080/about 你應(yīng)該看到相應(yīng)的頁(yè)面。

在我們構(gòu)建生成項(xiàng)目靜態(tài)資源前還需要修改它們的輸出路徑。在 frontend/config/index.js 找到下面的兩行

  1. index: path.resolve(__dirname, '../dist/index.html'),

  2. assetsRoot: path.resolve(__dirname, '../dist'),

然后成改如下內(nèi)容

  1. index: path.resolve(__dirname, '../../dist/index.html'),

  2. assetsRoot: path.resolve(__dirname, '../../dist'),

所以, 包含 html/css/js 靜態(tài)資源包的 /dist 文件夾和 /frontend 在同一級(jí)目錄下。現(xiàn)在你可以運(yùn)行 $ npm run build 去構(gòu)建項(xiàng)目了

后端

Flask 后端,我將使用 3.6 版本的 python。在根目錄 /flaskvue 文件夾下為后端代碼和初始化虛擬環(huán)境創(chuàng)建新的子目錄:

  1. $ mkdir backend

  2. $ cd backend

  3. $ virtualenv -p python3 venv

開(kāi)啟虛擬環(huán)境執(zhí)行(mac系統(tǒng)):

  1. $ source venv/bin/activate

在 Windows 上開(kāi)啟請(qǐng)看這里 docs。

在虛擬環(huán)境中安裝 Flask 如下:

  1. (venv) pip install Flask

現(xiàn)在讓我們開(kāi)始寫(xiě) Flask 服務(wù)器端代碼。在根目錄下創(chuàng)建 run.py 文件:

  1. (venv) cd ..

  2. (venv) touch run.py

然后添加以下代碼到這個(gè)文件:

  1. from flask import Flask, render_template

  2. app = Flask(__name__,

  3.            static_folder = './dist/static',

  4.            template_folder = './dist')

  5. @app.route('/')

  6. def index():

  7.    return render_template('index.html')

上面的代碼和 Flask 入門(mén)教程 “Hello world” 上的代碼稍有不同。最主要的不同點(diǎn)在于我們?cè)敿?xì)指明了前端的靜態(tài)和模板文件夾輸出到 /dist 文件夾。然后在根目錄下運(yùn)行 Flask 服務(wù)。

  1. (venv) FLASK_APP=run.py FLASK_DEBUG=1 flask run

這將會(huì)在 localhost:5000 開(kāi)啟一個(gè)后臺(tái)服務(wù)。 FLASK_APP 指向服務(wù)啟動(dòng)文件, FLASK_DEBUG=1 將會(huì)以調(diào)試模式運(yùn)行。如果沒(méi)有錯(cuò)誤,你將會(huì)看到熟悉的首頁(yè),這樣,服務(wù)器就成功運(yùn)行 Vue 應(yīng)用了。

與此同時(shí)如果你試圖訪問(wèn) /about 頁(yè)面將會(huì)出現(xiàn)一個(gè)錯(cuò)誤。Flask 會(huì)拋出一個(gè)找不到請(qǐng)求地址的錯(cuò)誤。實(shí)際上是因?yàn)樵?nbsp;vue-router 用了 HTML5 的 history 模式, 所以我們需要配置我們的后臺(tái)服務(wù)去重定向所有的路由都跳轉(zhuǎn)到 index.html 上。這在 Flask 上可以很簡(jiǎn)單做到。做如下修改:

  1. @app.route('/', defaults={'path': ''})

  2. @app.route('/')

  3. def catch_all(path):

  4.    return render_template('index.html')

現(xiàn)在地址 localhost:5000/about 將會(huì)重定向到 index.html 和 vue-router 將會(huì)在它自己內(nèi)部處理。

添加 404 頁(yè)面

因?yàn)樵谖覀兊暮笈_(tái)服務(wù)里設(shè)置捕捉所有路由是非常困難的,所以我們用 Flask 捕捉 404 錯(cuò)誤會(huì)重定向 所有 請(qǐng)求到 index.html(連同不存在的頁(yè)面)。在 Vue.js 應(yīng)用里處理未定義的路由。當(dāng)然,所有的工作均可在我們的路由文件設(shè)置。

在 frontend/src/router/index.js 增加一行:

  1. const routerOptions = [

  2.  { path: '/', component: 'Home' },

  3.  { path: '/about', component: 'About' },

  4.  { path: '*', component: 'NotFound' }

  5. ]

通配符 '*' 在 vue-router 里的含義是以上路由定義之外的情況?,F(xiàn)在我們需要在 /components 文件夾新建 NotFound.vue 文件。我簡(jiǎn)單地創(chuàng)建它:

  1. // NotFound.vue

  2.  

  3.    

    404 - Not Foundp>

  4.  div>

  5. template>

現(xiàn)在 通過(guò) npm run dev 重新啟動(dòng)前臺(tái)服務(wù)然后隨意輸入網(wǎng)址像 localhost:8080/gljhewrgoh。你應(yīng)該看到 “Not Found” 兩個(gè)單詞。

添加后端 API 接口

我的 Vue.js/Flask 教程的最后一個(gè)例子將在后端創(chuàng)建一個(gè) API 接口然后通過(guò)前端來(lái)調(diào)用它。我將創(chuàng)建一個(gè)隨機(jī)返回?cái)?shù)字1到100的簡(jiǎn)單端口。

打開(kāi) run.py 新增如下代碼:

  1. from flask import Flask, render_template, jsonify

  2. from random import *

  3. app = Flask(__name__,

  4.            static_folder = './dist/static',

  5.            template_folder = './dist')

  6. @app.route('/api/random')

  7. def random_number():

  8.    response = {

  9.        'randomNumber': randint(1, 100)

  10.    }

  11.    return jsonify(response)

  12. @app.route('/', defaults={'path': ''})

  13. @app.route('/')

  14. def catch_all(path):

  15.    return render_template('index.html')

我首先從 Flask 資源庫(kù)導(dǎo)入 random 庫(kù)和 jsonify 函數(shù)。然后我增加一個(gè)返回 JSON 數(shù)據(jù)格式的新路由 /api/random, 如下:

  1. {

  2.  'randomNumber': 36

  3. }

你可以通過(guò)地址: localhost:5000/api/random 來(lái)測(cè)試這個(gè)路由。

到這里,服務(wù)端的工作已經(jīng)完成了。該到客戶(hù)端上場(chǎng)了。我將修改 Home.vue 組件來(lái)顯示我的隨機(jī)數(shù)字:

  1.  

  2.    

    Home page

  3.    

    Random number from backend: {{ randomNumber }}

  4.    <> @click='getRandom'>New random number

  5.  

在這一步,我將在客戶(hù)端模擬隨機(jī)數(shù)的生成。所以,組件的工作過(guò)程如下:

  • 初始變量 randomNumber 等于 0

  • 在 methods 部分,我們用 getRandomInt(min, max) 函數(shù)從指定區(qū)間返回一個(gè)數(shù)字, getRandom 函數(shù)將調(diào)用上一個(gè)函數(shù)生成一個(gè)值賦給 randomNumber

  • 之后在組件被創(chuàng)建時(shí)調(diào)用 getRandom 方法給 randomNumber 賦個(gè)初始數(shù)值

  • 在按鈕點(diǎn)擊事件里,我們將觸發(fā) getRandom 方法去得到一個(gè)數(shù)值

現(xiàn)在,在首頁(yè)上你將看到由前端生成的隨機(jī)數(shù)。讓我們繼續(xù)來(lái)連接后端。

我將用 axios 庫(kù)來(lái)連接后端。它將允許我們創(chuàng)建能返回 Promise 對(duì)象的 HTTP 請(qǐng)求。我們先安裝它:

  1. (venv) cd frontend

  2. (venv) npm install --save axios

再次打開(kāi) Home.uve,修改 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多