Python Web实战:Flask + Vue 开发一个漂亮的词云网站

举报
Python小二 发表于 2021/12/30 01:29:33 2021/12/30
【摘要】 作者:snowspace@掘金 今天就分享一个用Flask做的词云生成网站,非常有意思的小web,适合练手。 这是一个前端用 Vue,后端用 Python 的 Web 框架 Flask 开发的词云生成应用,代码已上传到 flask-vue-word-cloud 项目地址:https://github.com/77Y/fl...

作者:snowspace@掘金


今天就分享一个用Flask做的词云生成网站,非常有意思的小web,适合练手。

这是一个前端用 Vue,后端用 Python 的 Web 框架 Flask 开发的词云生成应用,代码已上传到 flask-vue-word-cloud

项目地址:https://github.com/77Y/flask-vue-word-cloud

目录结构

先简单看一下项目的目录结构,backend 是 Flask 实现的服务端,frontend 是 Vue 实现的前端。


   
  1. .
  2. ├── backend
  3. │   ├── app
  4. │   └── venv
  5. └── frontend
  6. ├── README.md
  7. ├── build
  8. ├── config
  9. ├── dist
  10. ├── index.html
  11. ├── node_modules
  12. ├── package-lock.json
  13. ├── package.json
  14. ├── src
  15. └── static

再来看一下目前代码的运行效果:

86877ece7f4162d7ba112a978ca75450.png

开发环境

硬件:

  • macOS Mojave 10.14.6

软件:

  • nodejs v11.6.0

  • Python 3.7.4

请确保已经安装好了node js 环境,可参考nodejs官网进行安装。

前端开发

1、安装vue-cli

安装 vue-cli Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。

$ npm install -g vue-cli
  

2、创建项目

新建目录


   
  1. $ mkdir word-cloud
  2. $ cd word-cloud/

创建项目

$ vue init webpack frontend
  

执行完上面的命令后,会让你设置项目的基本信息,我的配置如下:

8258f70e771a95ef89e3e7ba37c8d19f.png

然后等待安装一些基本的依赖,完成之后进入到 frontend 目录


   
  1. $ cd frontend
  2. $ npm run dev

执行完后会在控制台提示

Your application is running here: http://localhost:8080
  

说明我们现在已经可以跑起来了,可以访问一下http://localhost:8080,如下:

eb2651eee7833a83af855b2a0bf5628c.png

这时我们再看一下 frontend 的目录结构,已经默认帮我们生成了一些目录和代码。


   
  1. .
  2. ├── README.md
  3. ├── build
  4. ├── config
  5. ├── index.html
  6. ├── node_modules
  7. ├── package-lock.json
  8. ├── package.json
  9. ├── src
  10. └── static

3、安装element-ui

Element 是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。

$ npm i element-ui -S
  

使用插件

在 vue-cli 帮我们生成的目录中/src/main.js中导入ElementUI


   
  1. import ElementUI from'element-ui'
  2. import'element-ui/lib/theme-chalk/index.css'

最后使用

Vue.use(ElementUI)
  

4、安装axios

因为是前后端分离的应用,所以还要安装请求的库axios。axios 是基于 promise 的 HTTP 客户端。

$ npm install --save axios
  

同样在/src/main.js导入axios

import axios from 'axios'
  

注册axios

Vue.prototype.axios = axios
  

之后我们就可以使用 axios 发送请求了。

5、编写页面

先找到App.vue,把我们不需要的 logo 删掉。


   
  1. <template>
  2. <div id="app">
  3. <!-- <img src="./assets/logo.png"> -->
  4. <router-view/>
  5. </div>
  6. </template>

新建WordCloud.vue,这就是我们的主要页面。一个标题,一个输入框,两个按钮。


   
  1. <template>
  2. <div>
  3. <h2>小词云</h2>
  4. <div id="word-text-area">
  5. <el-input type="textarea" :rows="10" placeholder="请输入内容" v-model="textarea">
  6. </el-input>
  7. <div id="word-img">
  8. <el-image :src="'data:image/png;base64,'+pic" :fit="fit">
  9. <div slot="error" class="image-slot">
  10. <i class="el-icon-picture-outline"></i>
  11. </div>
  12. </el-image>
  13. </div>
  14. <div id="word-operation">
  15. <el-row>
  16. <el-button type="primary" @click="onSubmit" round>生成词云</el-button>
  17. <el-button type="success" @click="onDownload" round>下载图片</el-button>
  18. </el-row>
  19. </div>
  20. </div>
  21. </div>
  22. </template>

实现点击事件并发送请求


   
  1. <script>
  2. exportdefault {
  3. name: 'wordcloud',
  4. data() {
  5. return {
  6. textarea: '',
  7. pic: "",
  8. pageTitle: 'Flask Vue Word Cloud',
  9. }
  10. },
  11. methods: {
  12. onSubmit() {
  13. var param = {
  14. "word": this.textarea
  15. }
  16. this.axios.post("/word/cloud/generate", param).then(
  17. res => {
  18. this.pic = res.data
  19. console.log(res.data)
  20. }
  21. ).catch(res => {
  22. console.log(res.data.res)
  23. })
  24. },
  25. onDownload() {
  26. const imgUrl = 'data:image/png;base64,' + this.pic
  27. const a = document.createElement('a')
  28. a.href = imgUrl
  29. a.setAttribute('download', 'word-cloud')
  30. a.click()
  31. }
  32. }
  33. }
  34. </script>

最后在src/router中找到index.js修改一下路由。


   
  1. export default new Router({
  2. routes: [{
  3. path: '/',
  4. name: 'index',
  5. component: WordCloud
  6. }]
  7. })

打包资源

$ npm run build
  

执行完成后会将资源打包到dist目录。

至此,前端的开发工作就完成了。

后端开发

1、安装Python3

先安装一下Python3,这里我使用 homebrew 安装。

brew install python3
  

由于我之前已经安装过了,执行完成之后出现警告,按照提示操作

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
  

再次出现错误,没有权限

参考处理:stackoverflow.com/questions/2…

sudo chown -R $USER:admin /usr/local
  

再次执行

brew link python
  
Linking /usr/local/Cellar/python/3.7.4_1... 1 symlinks created
  

错误解决,执行 python3 可以正确显示版本号。


   
  1. $ python3
  2. Python 3.7.4 (default, Sep 7 2019, 18:27:02)
  3. [Clang 10.0.1 (clang-1001.0.46.4)] on darwin
  4. Type "help", "copyright", "credits" or "license" for more information.

2、创建虚拟环境

Python 虚拟环境可以为 Python 项目提供独立的运行环境,使得不同的应用使用不同的 Python 版本,我们使用虚拟环境开发一个 Python 应用。

新建后端目录


   
  1. $ mkdir backend
  2. $ cd backend/

创建虚拟环境

python3 -m venv venv
  

激活虚拟环境

source venv/bin/activate
  

关闭虚拟环境的命令如下

deactivate
  

3、安装 flask

关于 flask 我们在文章最开始已经介绍过。

pip install flask
  

如果没有报错,那就就安装成果了。

4、安装词云生成库

wordcloud 是 python 优秀的词云生成库。词云以词语为基本单位更加直观的展示文本。

e159387b93556b8810fbade5cfd91228.png
pip install wordcloud
  

4、编写代码

关于 flask 代码部分参考了The Flask Mega-Tutorial教程,看完第一章就可以写出应用了。这里我解释一下关键代码。

__init__.py中修改python默认html和静态资源目录,这个资源就是我们上面在前端开发中通过npm run build生成的资源目录。


   
  1. app = Flask(__name__,
  2. template_folder="../../frontend/dist",
  3. static_folder="../../frontend/dist/static")

修改完成之后再启动 Flask,访问的就是 vue 的页面了。

routes.py 里面的代码,就是主页面和生成词云的接口。


   
  1. # 真正调用词云库生成图片
  2. def get_word_cloud(text):
  3. # font = "./SimHei.ttf"
  4. # pil_img = WordCloud(width=500, height=500, font_path=font).generate(text=text).to_image()
  5. pil_img = WordCloud(width=800, height=300, background_color="white").generate(text=text).to_image()
  6. img = io.BytesIO()
  7. pil_img.save(img, "PNG")
  8. img.seek(0)
  9. img_base64 = base64.b64encode(img.getvalue()).decode()
  10. return img_base64
  11. # 主页面
  12. @app.route('/')
  13. @app.route('/index')
  14. def index():
  15. return render_template('index.html')
  16. # 生成词云图片接口,以base64格式返回
  17. @app.route('/word/cloud/generate', methods=["POST"])
  18. def cloud():
  19. text = request.json.get("word")
  20. res = get_word_cloud(text)
  21. return res

最后执行flask run就可以跑起来了

当然这是用半天时间跑起来的一个简陋的应用,但是具备了基本的前后端分离应用的功能。

往期回顾:

文章来源: ityard.blog.csdn.net,作者:Python小二,版权归原作者所有,如需转载,请联系作者。

原文链接:ityard.blog.csdn.net/article/details/122206608

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。