前言這是一個前端用 Vue,后端用 Python 的 Web 框架 Flask 開發(fā)的詞云生成應(yīng)用,代碼已上傳到 flask-vue-word-cloud
項目地址:https://github.com/77Y/flask-vue-word-cloud
寫這個小項目的起因是最近團隊年終述職,有一些大佬的 PPT 上用了詞云來展示自己團隊一年的工作成果;還有大佬說不要守著自己的一畝三分地,在技術(shù)上拓寬視野可以幫助我們更好的成長
正好之前接觸過 Python 和 R 生成詞云,于是作為一個移動端開發(fā)者,想在本地跑一個生成詞云的服務(wù),就有了這個項目
目錄結(jié)構(gòu)先簡單看一下項目的目錄結(jié)構(gòu),backend 是 Flask 實現(xiàn)的服務(wù)端,frontend 是 Vue 實現(xiàn)的前端。
。
├── backend
│ ├── app
│ └── venv
└── frontend
├── README.md
├── build
├── config
├── dist
├── index.html
├── node_modules
├── package-lock.json
├── package.json
├── src
└── static
開發(fā)環(huán)境硬件:
macOS Mojave 10.14.6
軟件:
nodejs v11.6.0
Python 3.7.4
請確保已經(jīng)安裝好了node js 環(huán)境,可參考nodejs官網(wǎng)進行安裝。
前端開發(fā)1、安裝vue-cli安裝 vue-cliVue CLI 是一個基于 Vue.js 進行快速開發(fā)的完整系統(tǒng)。
$ npm install -g vue-cli
2、創(chuàng)建項目新建目錄
$ mkdir word-cloud
$ cd word-cloud/
創(chuàng)建項目
$ vue init webpack frontend
執(zhí)行完上面的命令后,會讓你設(shè)置項目的基本信息,我的配置如下:
然后等待安裝一些基本的依賴,完成之后進入到 frontend 目錄
$ cd frontend
$ npm run dev
執(zhí)行完后會在控制臺提示
Your application is running here: http://localhost:8080
說明我們現(xiàn)在已經(jīng)可以跑起來了,可以訪問一下http://localhost:8080
這時我們再看一下 frontend 的目錄結(jié)構(gòu),已經(jīng)默認(rèn)幫我們生成了一些目錄和代碼。
。
├── README.md
├── build
├── config
├── index.html
├── node_modules
├── package-lock.json
├── package.json
├── src
└── static
3、安裝element-uiElement 是一套為開發(fā)者、設(shè)計師和產(chǎn)品經(jīng)理準(zhǔn)備的基于 Vue 2.0 的桌面端組件庫。
$ npm i element-ui -S
使用插件
在 vue-cli 幫我們生成的目錄中/src/main.js中導(dǎo)入ElementUI
import ElementUI from‘element-ui’import‘element-ui/lib/theme-chalk/index.css’
最后使用
Vue.use(ElementUI)
4、安裝axios因為是前后端分離的應(yīng)用,所以還要安裝請求的庫axios。axios 是基于 promise 的 HTTP 客戶端。
$ npm install --save axios
同樣在/src/main.js導(dǎo)入axios
import axios from ‘a(chǎn)xios’
注冊axios
Vue.prototype.axios = axios
之后我們就可以使用 axios 發(fā)送請求了。
5、編寫頁面先找到App.vue,把我們不需要的 logo 刪掉。
《template》《div id=“app”》《!-- 《img src=“。/assets/logo.png”》 --》《router-view/》《/div》《/template》
新建WordCloud.vue,這就是我們的主要頁面。一個標(biāo)題,一個輸入框,兩個按鈕。
《template》《div》《h2》小詞云《/h2》《div id=“word-text-area”》《el-input type=“textarea” :rows=“10” placeholder=“請輸入內(nèi)容” v-model=“textarea”》《/el-input》《div id=“word-img”》《el-image :src=“‘data:image/png;base64,’+pic” :fit=“fit”》《div slot=“error” class=“image-slot”》《i class=“el-icon-picture-outline”》《/i》《/div》《/el-image》《/div》《div id=“word-operation”》《el-row》《el-button type=“primary” @click=“onSubmit” round》生成詞云《/el-button》《el-button type=“success” @click=“onDownload” round》下載圖片《/el-button》《/el-row》《/div》《/div》《/div》《/template》
實現(xiàn)點擊事件并發(fā)送請求
《script》
exportdefault {
name: ‘wordcloud’,
data() {
return {
textarea: ‘’,
pic: “”,
pageTitle: ‘Flask Vue Word Cloud’,
}
},
methods: {
onSubmit() {
var param = {
“word”: this.textarea
}
this.axios.post(“/word/cloud/generate”, param).then(
res =》 {
this.pic = res.data
console.log(res.data)
}
).catch(res =》 {
console.log(res.data.res)
})
},
onDownload() {
const imgUrl = ‘data:image/png;base64,’ + this.pic
const a = document.createElement(‘a(chǎn)’)
a.href = imgUrl
a.setAttribute(‘download’, ‘word-cloud’)
a.click()
}
}
}
《/script》
最后在src/router中找到index.js修改一下路由。
export default new Router({
routes: [{
path: ‘/’,
name: ‘index’,
component: WordCloud
}]
})
打包資源
$ npm run build
執(zhí)行完成后會將資源打包到dist目錄。
至此,前端的開發(fā)工作就完成了。
后端開發(fā)1、安裝Python3先安裝一下Python3,這里我使用 homebrew 安裝。
brew install python3
由于我之前已經(jīng)安裝過了,執(zhí)行完成之后出現(xiàn)警告,按照提示操作
Warning: python 3.7.4_1 is already installed, it‘s just not linked You can use brew link python to link this version.
Linking /usr/local/Cellar/python/3.7.4_1.。。 Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks
再次出現(xiàn)錯誤,沒有權(quán)限
參考處理:stackoverflow.com/questions/2…
sudo chown -R $USER:admin /usr/local
再次執(zhí)行
brew link python
Linking /usr/local/Cellar/python/3.7.4_1.。。 1 symlinks created
錯誤解決,執(zhí)行 python3 可以正確顯示版本號。
$ python3
Python 3.7.4 (default, Sep 7 2019, 1802)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type “help”, “copyright”, “credits” or “l(fā)icense” for more information.
2、創(chuàng)建虛擬環(huán)境Python 虛擬環(huán)境可以為 Python 項目提供獨立的運行環(huán)境,使得不同的應(yīng)用使用不同的 Python 版本,我們使用虛擬環(huán)境開發(fā)一個 Python 應(yīng)用。
新建后端目錄
$ mkdir backend
$ cd backend/
創(chuàng)建虛擬環(huán)境
python3 -m venv venv
激活虛擬環(huán)境
source venv/bin/activate
關(guān)閉虛擬環(huán)境的命令如下
deactivate
3、安裝 flask關(guān)于 flask 我們在文章最開始已經(jīng)介紹過。
pip install flask
如果沒有報錯,那就就安裝成果了。
4、安裝詞云生成庫wordcloud 是 python 優(yōu)秀的詞云生成庫。詞云以詞語為基本單位更加直觀的展示文本。
pip install wordcloud
4、編寫代碼關(guān)于 flask 代碼部分參考了The Flask Mega-Tutorial教程,看完第一章就可以寫出應(yīng)用了。這里我解釋一下關(guān)鍵代碼。
在__init__.py中修改python默認(rèn)html和靜態(tài)資源目錄,這個資源就是我們上面在前端開發(fā)中通過npm run build生成的資源目錄。
app = Flask(__name__,
template_folder=“。。/。。/frontend/dist”,
static_folder=“。。/。。/frontend/dist/static”)
修改完成之后再啟動 Flask,訪問的就是 vue 的頁面了。
routes.py 里面的代碼,就是主頁面和生成詞云的接口。
# 真正調(diào)用詞云庫生成圖片def get_word_cloud(text):# font = “。/SimHei.ttf”# pil_img = WordCloud(width=500, height=500, font_path=font).generate(text=text).to_image()
pil_img = WordCloud(width=800, height=300, background_color=“white”).generate(text=text).to_image()
img = io.BytesIO()
pil_img.save(img, “PNG”)
img.seek(0)
img_base64 = base64.b64encode(img.getvalue()).decode()
return img_base64
# 主頁面@app.route(’/‘)@app.route(’/index‘)def index():return render_template(’index.html‘)
# 生成詞云圖片接口,以base64格式返回@app.route(’/word/cloud/generate‘, methods=[“POST”])def cloud():
text = request.json.get(“word”)
res = get_word_cloud(text)
return res
最后執(zhí)行flask run就可以跑起來了
當(dāng)然這是用半天時間跑起來的一個簡陋的應(yīng)用,但是具備了基本的前后端分離應(yīng)用的功能
編輯:jq
-
Web
+關(guān)注
關(guān)注
2文章
1263瀏覽量
69464 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84688 -
vue
+關(guān)注
關(guān)注
0文章
58瀏覽量
7846
原文標(biāo)題:實戰(zhàn):Flask + Vue 生成漂亮的詞云
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論