内容简介:最近在工作中做一个小型的查询系统,由于比较简单,前后端全是我一个人做。在这里从前端同学的视角讲解并记录前后端同时开发的过程,希望能为广大对前后端都有兴趣的同学提供思路~前端主要使用了IDE我推荐VSCode (ง •_•)ง
最近在工作中做一个小型的查询系统,由于比较简单,前后端全是我一个人做。在这里从前端同学的视角讲解并记录前后端同时开发的过程,希望能为广大对前后端都有兴趣的同学提供思路~
一.相关技术
1.前端
前端主要使用了 Vue+ElementUI+axios(http数据请求)
IDE我推荐VSCode (ง •_•)ง
VSCode:VSCode下载地址
2.后端
后端接入层使用 Python(3.7版本)+ Flask(Python的一种Web应用框架)
在这里IDE我用的PyCharm
PyCharm:PyCharm下载地址
使用 gunicorn 作为Flask的Web Server
使用 supervisor 进行进程管理(可以快速的用命令行的形式对我们的Flask应用启动,关闭,重启,查看状态)
二.需求分析和开发思路
1.需求分析
本系统主要是给运维同事做数据分析使用,主要功能就是复合条件查询,然后以列表形式展示数据
2.开发思路
1)根据我们的需求,用Vue+ElementUI开发前端SPA(单页应用),从前端对Flask应用发起http数据请求
2)由于数据来源是组内后端同事提供的Druid(大家可以理解为数据库即可),根据请求规则,用 Python 对Druid进行数据请求即可获取数据
总结一下:使用时在前端输入查询条件,点击查询发起http请求,请求的接口是我们在Flask应用中写好的,获取查询条件后,再根据查询条件用Python对Druid发起数据请求,待Druid返回查询结果后,经过我们的一些逻辑处理(比如异常处理或者返回格式的处理),最终返回给前端,供前端进行数据展示,其概念如下图所示。
三.撸起袖子开始Coding
1.前端工程的搭建
1)需要的准备工作:
nodejs的安装:nodejs下载地址
2)准备工作完成后,我们用npm下载截止到2019年1月30日最新的vue-cli3,便于我们获取最新的vue脚手架工程
npm install -g @vue/cli
vue-cli3下载完成后,使用命令行获取最新vue脚手架工程
vue create my-project
3)至此,我们就有了官方的脚手架工程,我们可以在其中根据项目需求进行更改
2.Flask应用的搭建
1)python的安装:python下载地址
并且配置好环境变量
2)使用python自带的包管理工具pip,安装virtualenv
pip install virtualenv
这里安装virtualenv虚拟环境是用来针对依赖不同版本,不同包的多个Flask应用做开发
3)使用PyCharm创建Flask应用工程,如下图所示。
注:如果不用PyCharm创建Flask工程的话,还要单独用pip命令安装Flask
3.用Flask应用实现前端接入层api
首先上代码
from flask import Flask, render_template from flask import request #在引入requests和json前,要用pip install requests,json进行安装 import requests,json app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/here/js_get', methods=['GET']) def js_get(): #python请求Druid的url url = "http://x.x.x.x:x/druid/v2/?pretty" headers = {'content-type':'application/json','Accept-Charset':'UTF8'} #python请求Druid的参数 #request.values就是前端传过来的几个关键参数 #以request.values['timeStamp']为例,如果这个字段是字符串,直接获取即可 #如果是字典或者数组,切记要用json.loads(request.values['timeStamp'])将其格式转换后再进行python代码中的逻辑处理 param={ requestId:request.values['requestId'], fileKey:request.values['fileKey'], timeStamp:request.values['timeStamp'] } #这里python向Druid发起请求 r = requests.post(url, data=json.dumps(param), headers=headers) #r.text就是python请求后拿到的数据,用json.dumps()将其转换成字符串后返回 result = json.dumps(r.text) return result if __name__ == '__main__': app.run("0.0.0.0") 复制代码
我把自己项目中的代码进行了精简,拿掉了逻辑处理,格式处理等影响直观理解的部分。 我们看上面的代码,首先我们要理解以下这部分,这部分代码指定了我们的Flask应用,会让前端用户在打开链接后,从index.html进入我们的前端应用
@app.route('/') def index(): return render_template('index.html') 复制代码
接着我们看下面的代码,这部分指的是,在我们的Flask应用中,有一个api叫做/here/js_get,请求方法是GET方法,由于前端工程打包后是放在Flask应用相应位置中,所以域名会自动补齐,比如我访问前端界面的域名是www.test.com,那么完整的请求链接就是 www.test.com/here/js_get,在前端进行请求时,域名不需要自己添加(前端请求代码我在后面会写)
@app.route('/here/js_get', methods=['GET']) def js_get(): 复制代码
最后,让我们看一下下面这部分代码,这部分代码中app.run(0.0.0.0)指的是我们的Flask应用不限制访问ip地址
if __name__ == '__main__': app.run("0.0.0.0") 复制代码
大家看到这里可能有些疑惑,Flask应用是怎么和前端工程结合在一起的,@app.route('/')这句代码又是怎么控制用户访问index.html的,别着急,我们一步一步来讲
4.前端如何调用Flask应用的api接口
首先让我们用npm来安装axios npm install axios --save-dev
在Vue工程中,如下代码所示,使用axios发起http请求,调用Flask应用的api接口,最终数据会通过res.data返回,如果请求异常,会进入err部分
<script> import axios from 'axios' export default { name:'Example', data(){ return{ requestId:'', fileKey:'', timeStamp:'' } } methods:{ startSearching(){ axios.get('/here/js_get',{ params:{ requestId:this.requestId, fileKey:this.fileKey, timeStamp:this.timeStamp } }).then((res)=>{ //res.data就是http请求返回的数据,我们获取后可用作数据展示 },(err)=>{ //请求失败时进入这部分;比如500,404等情况 }) } } } </script> 复制代码
这样,简单的前端调用Flask应用api部分的代码就写完了,如果在开发阶段需要前后端联调,可以用webpack的proxy进行跨域处理,防止localhost和api域名不一致导致的跨域问题。
下面让我们来讲一下在前端工程和Flask应用都开发完成后,如何进行发布工作
5.前端打包,后端部署相关工作
1)首先vue-cli3的脚手架工程是集成了Webpack4的,默认情况下执行命令行 npm run build
即可进行打包工作,我打包后的dist目录如下图所示。
3)相关环境配置好后,上传我们的Python工程代码,如果我们的工程中根目录下没有 static 文件夹和 templates 文件夹,请创建。还记得我上面前端用webpack打包后的代码吗?将其中的index.html放入templates文件夹中,其他所有文件放入static文件夹中(这里要比较熟悉linux的相关文件操作才比较方便)
4)前端打包代码放入相应位置后,运行我们的Python代码,由于本项目只是用Python进行接入层api的开发,所以我的代码都在一个python文件内。比如我的文件叫做app.py,那么我通过python app.py执行这个文件。此时整个Flask应用就运行了起来,用户可以通过浏览器访问所配置的相关域名访问前端界面(这一步要用nginx做相关配置工作)
还记得我们Flask应用中下面的这部分代码吗?
@app.route('/') def index(): return render_template('index.html') 复制代码
这里路由的'/'恰恰就是指我们直接打开域名就访问了Flask应用中的index.html,假设我们的域名是www.test.com,这里的路由我们改写为app.route('/first'),那么我们访问index.html的域名就要变成www.test.com/first,没有www.test.com看起来直观,对吧?所以这里的路由配置为app.route('/')的作用就在于让访问者通过域名可以直接访问index.html
6.gunicorn和supervisor
我们之前所说的,是我们执行python代码后,让用户可以通过浏览器访问,这种情况下,当我们断开和服务器的连接后,python服务就会终止。即使我们断开和服务器的连接不会导致python服务终止,假如我们在同一台服务器下,有多个Flask应用,在没有 工具 的帮助下,我们无法很好的控制哪些Flask应用启动,哪些终止,哪些重启。此时,做python后端开发的同事向我推荐了gunicorn + supervisor,前者是作为Web Server,后者用于对Flask应用做进程管理
1)gunicorn
linux环境下执行命令行安装gunicorn
pip install gunicorn
2)supervisor
linux环境下安装supervisor
pip install supervisor
然后执行如下命令,生成supervisor初始配置文件
echo_supervisord_conf > /usr/etc/supervisord.conf
后面的/usr/etc/supervisord.conf是生成配置文件的路径
生成配置文件后,我们用vim进入配置文件内,在最后加入
[include] files = /root/flask_demo/supervisord.conf 复制代码
以上代码表示,配置文件中的配置信息,还包含了files路径下的相关配置信息,相当于二者取并集才是最终的配置信息,但此时我在相关路径下还没有创建配置文件,flask_demo是我的Flask工程目录,进入其中,创建supervisord.conf,并用vim进行编辑,我的配置文件内容如下
[program:app] command=/usr/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app process_name=%(program_name)s numprocs=1 directory=/root/flask_demo/ autostart=true autorestart=unexpected stdout_logfile=/root/flask_demo/log/stdout.log stderr_logfile=/root/flask_demo/log/stderr.log 复制代码
其中command那一行是gunicorn的命令,-w指的是worker,-w后面的数字是worker数量,-b指地址,后面跟着地址信息,app:app,其中前者指的是python文件名称,我的是app.py,后者指的是Flask应用名称
配置信息编辑完成后,执行
supervisord -c /root/usr/etc/supervisord.conf
看到这里大家可能会诧异,不是supervisor吗,怎么变成supervisord了?其实supervisor是由supervisord和supervisorctl两部分命令行组成的。上面的命令行中,我们用全局的supervisord.conf配置文件执行了supervisord命令(我们全局的supervisord.conf配置文件包含了我们项目中自定义的配置文件,此时执行全局的就相当于执行了我们项目内部的配置文件) 之后执行命令
supervisorctl
此时若出现我们Flask应用的状态,则代表我们成功,如下图所示
在supervisorctl命令下,我们可以通过status命令,查看我们所有的Flask应用的当前状态,通过start + 应用名,stop + 应用名 控制某个具体的Flask应用启动还是停止。
Flask应用启动状态下,我们可以通过linux命令,验证当前Flask应用进程情况
ps aux|grep app:app
查看到如下图所示:
四.总结
以上就是本次我要和大家分享的内容,希望这篇分享能够帮助到大家(ฅ´ω`ฅ)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 细说Sonar之——前端接入篇
- 开源 | BFE:基于百度统一前端技术框架开源的七层流量接入系统
- 面对前端六年历史代码,如何接入并应用ES6解放开发效率
- 云转码接入视频网站解决方案 express-ffmpeg接入discuz方案
- 数据接入治理平台
- 【Netty】如何接入新连接
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序设计语言理论基础
米切尔 / 电子工业出版社 / 2006-11 / 68.00元
本书提出了一个框架,用于分析程序设计语言的语法、操作和语义性质,该框架基于称为类型化λ演算的数学系统。λ演算的主要特色是对于函数和其他可计算的值的一种记法,以及一个等式逻辑和用于表达式求值的一组规则。本书中最简单的系统是称为泛代数的一个等式系统,它可以用来公理化和分析通常用于程序设计的许多数据类型。可作为理论计算机科学、软件系统和数学专业的大学本科高年级或者研究生初始学习阶段的教材,同时也适合用于......一起来看看 《程序设计语言理论基础》 这本书的介绍吧!