使用Flask和Vue.js实现前后端分离的全栈开发

在工作中,我使用Vue.js有一年多了,因为Vue.js文档完善,上手简单,打包方便等诸多优势,所以是目前很流行的前端框架,本项目也选择Vue.js作为前端框架。对于后端,本项目选择的是比较好上手、轻量级的python后台框架:Flask。

我前前后后花了大概两周的时间,踩了很多坑,参考了很多博客,最终使用Flask + Vue.js + Vuetify-UI 实现了一个比较新颖的喵星君大大四柱八字排盘系统.,这篇文章接下来会将开发的步骤和代码一一展示出来,供大家参考,希望大家能少踩点坑。

一、使用Vue-cli搭建前端框架

1、安装vue-cli

如果之前安装过了vue,可以输入vue --version 来查看当前的vue版本是否是3.x以上的版本,如果返回的版本是旧版本 (1.x 或 2.x),你需要先通过 npm uninstall vue-cli -g 卸载它。

查看vue-cli版本的命令行

如果提示你vue命令无法识别,那么首先全局安装vue-cli,使用如下命令行:

全局安装vue-cli命令行

安装了最新版本的vue-cli之后,推荐使用vue ui命令以图形化界面创建和管理项目,输入vue ui会弹出一个Vue项目管理器界面。

输入vue ui命令,打开项目管理界面

2、创建Vue项目

创建Vue项目界面

本项目在创建过程勾选了手动配置项目,勾选项如图所示,创建过程只需要根据图形化界面的引导完成创建。

勾选Babel,Router, Vuex, Linter配置项
选择hash路由

在项目的详情页,就可以运行编译和热更新、启动以及打包你的前端代码了。

项目管理详情页

3、或者直接下载模板,快速启动项目

如果想利用现成的Vuetify UI组件模板快速建立Vue工程,也可以跳过上述步骤,直接下载Vuetify模块.

下载模板后,打开工程,输入命令:npm install, 接着输入npm run dev,启动前端工程。

二、在Vue工程中增加页面及路由

找到router.js文件,在该文件增加两个前端页面的路由,


import Vue from 'vue'

import Router from 'vue-router'

Vue.use(Router)

export default new Router({

  // mode: 'history',

  // base: process.env.BASE_URL,

  routes: [

    {

      path: '/',

      component: () => import('@/views/dashboard/Index')

    },

    {

          name: 'Result',

          path: 'paipanResult',

          component: () => import('@/views/dashboard/paipanResult'),

    }

  ],

})

在对应路径下增加两个新页面,其中默认首页为表单页,另一个为排盘结果展示页。由于采用前后端分离的开发方式,前端在制作页面时,如果后端接口还没能提供出来,可以先用一些初始化数据来代替。

三、创建Flask工程

新建一个文件名为index.py的python文件,与vue-project工程并列放置。

新建Flask文件存放路径

在index.py文件导入Flask相关包, 代码如图。


from flask import Flask, jsonify, request

from flask_cors import CORS

from pyfiles.flask_paipan import * # 从pyfiles文件夹导入已写好的python库

from ppbazi import pp

app = Flask(__name__)    #  通过Flask方法注册app,以后所有的route都是app开头

app.config.from_object(__name__)

CORS(app, resources={r'/*': {'origins': '*'}})  #  跨域访问时使用,不跨域可将本行代码去掉

app.register_blueprint(pp,url_prefix='/paipan')

@app.route('/api/submit', methods=['GET', 'POST']) # 提供接口,获取前端页面的提交的表单参数,通过调用其他文件写好的PaiPan函数,获得排盘结果,并以Json格式返回给前端页面

def submit():   

    response_object = {'status': 'success'}

    if request.method == 'POST':

        post_data = request.get_json()

        year = post_data.get('year')

        month = post_data.get('month')

        day = post_data.get('day')

        hour = post_data.get('hour')

        minute = post_data.get('minute')

        sex = post_data.get('sex')

        city = post_data.get('city')

        birth = [year, month, day, hour, minute]



        exe = PaiPan(year, month, day, hour, minute, city, sex)



        truetime = exe.Sun_Time()

        bazi = exe.Paipan()

        qiyun = exe.Qi_yun()

        canggan = exe.CangGan()

        tengods = exe.Tengod()

        cg_tengods = exe.CangGan_TenGods()

        wangshuai = exe.WangS()



        context = {

            "sexArray": sex,

            "cityArray": city,

            "birthDay": birth,

            ...

        }

        response_object['context'] = context

    else:

        response_object['message'] = 'method is error'

    return jsonify(response_object)

if __name__ == '__main__':

    app.run()

四、Blueprint(蓝图)路径的配置

在相同路径下,新建ppbazi.py的蓝图文件,配置蓝图指向,代码如下。


from flask import Blueprint,render_template,abort  #  render_template 指向的是templates文件夹

from jinja2 import TemplateNotFound

pp = Blueprint("paipan",__name__,url_prefix="/paipan", template_folder='templates')

@pp.route('/')

def get_sample():

    try:

        return render_template('index.html')

    except TemplateNotFound:

        abort(404)

五、Vue工程调用API接口

在表单提交页面引入axios 库,并输入命令行:npm install axios --save 进行安装。

接着编写submit方法,在点击<提交>按钮时,触发该方法,submit方法主要是通过axios调用上述步骤四完成的API接口,传入用户填写的表单数据,获取排盘结果的数据返回。


<script>

import axios from 'axios'


        submit(){

        const url = ‘http://localhost:5000/api/submit'

        axios.post(url, {

          year: yymmddList[0],

          month: yymmddList[1],

          day: yymmddList[2],

          hour: hhmmssList[0],

          minute: hhmmssList[1],

          sex: this.sex,

          city: this.city,

        })

        .then((response) => {

          console.log('responseData', response)

          this.$router.push({ name: 'Result' })

        })

        }

</script>

六、打包前端工程,并放入指定路径

在vue.config.js加入这几句导出路径代码


const path = require('path');

module.exports = {

  ...

  assetsDir: process.env.NODE_ENV === 'production'? '../static' : 'static',

  publicPath: process.env.NODE_ENV === 'production'? './' : '/',

  outputDir: path.resolve(__dirname, '../templates')

}

接着输入命令行npm run build 对前端程序进行打包,最后的打包结果如图所示。

前端工程打包结果

七、启动python程序,可访问系统

最后运行index.py程序,打开浏览器输入http://127.0.0.1:5000/paipan 即可进入网站。

在pycharm启动index.py程序

网站效果如图:

表单页
排盘结果页
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352