1. 程式人生 > >vue做前端,flask做後臺,使用ajax傳遞json

vue做前端,flask做後臺,使用ajax傳遞json

照樣是個記錄博文,是從九月份開始,幫老師做的一個app,一直到現在....不能直接貼專案的原始碼,我貼出的是用於測試的完整程式碼,有時間會繼續更新...

其實做的是個網頁,通過HBuilder可以轉成app

先說幾個注意點(前提都是基於vue和flask的):

1. 使用ajax發起post請求,後臺沒反應,前臺不報錯,可能是因為cors,也就是跨域請求問題,原因是AJAX只能同源使用,cors允許瀏覽器向跨源伺服器,發出XMLHttpRequest請求,克服了這個缺點。困擾了一下午,感謝曹老師提醒。

解決程式碼(加在flask)

from flask_cors import CORS
CORS(app, resources=r'/*')

2. json資料問題,我給後臺傳遞起止時間,後臺給我這段時間內的資料,以為json格式是 時間:資料   ,但是後來發現這樣,取資料不容易取,於是改成了 time:時間,num:資料 ,

對應程式碼是:

    dict={}
    dic={}
    dic['res_data']=[]
    for i in range(c):
        a = a + datetime.timedelta(days = 1)
        astr=str(a)
        dict['time']=astr
        dict['num']=random.randint(1,10)
        dic['res_data'].append(dict)
    print(dic)

3. v-model  可以簡單理解成雙向資料繫結

<input v-model="beginTime" placeholder="edit me beginTime">

data () {
    return {
      'id': '100010',
      'beginTime': '',
      'endTime': '',
      'selectContent': ''
    }
  },

在input輸入後,data裡面的beginTime也就有了值

<currency-input v-model="price"></currentcy-input>
  <span>{{price}}</span>

 也有上面這個用法,輸入後,在後面的span實時顯示

4. import axios from 'axios'與

     axios.post(path, dat)
          .then(res => {
            alert(res.data.res_data[0].num)
          })
          .catch(error => {
            alert(error)
          })一起使用

this.$axios.post(path, dat)
          .then(res => {
            alert(res.data.res_data[0].num)
          })
          .catch(error => {
            alert(error)
          })就不需要import

5. vue通過事件繫結,獲取元素的各種屬性,例如id和innetText,

注:'event' 是原生 dom事件

<button @click="get_id" id='is_id'>get_id</button>

get_id (event) {
      alert(event.currentTarget.id)
      alert(event.currentTarget.innerText)
    }

貼出幾張圖,是在傳json陣列時用到的(json和ajax,算是自學了....有錯誤的地方麻煩指出)

原始碼:

提醒:輸入的日期格式是2018-10-10

伺服器端的test.py(import的有點多,我是在之前寫過的flask直接複製了個模板過來,不需要的可以刪掉)

#-*-coding:UTF-8 -*-
import os,sys
import flask
from flask import Flask
import socket
from flask import request
from flask import redirect
from flask import make_response,render_template
app = Flask(__name__)
from flask import Flask, render_template, jsonify
from random import *

from dateutil.parser import parse
import random
import datetime
import json
app = Flask(__name__,
            static_folder = "./dist/static",
            template_folder = "./dist")

from flask_cors import CORS
CORS(app, resources=r'/*')
@app.route('/test', methods=['POST', 'GET'])
def test():
    id=request.json['id']
    beg=request.json['beginTime']
    end=request.json['endTime']
    selectContent=request.json['selectContent']
    a = parse(end)
    b = parse(beg)
    c=(a-b).days
    print(c)
    dict={}
    dic={}
    dic['res_data']=[]
    for i in range(c):
        a = a + datetime.timedelta(days = 1)
        astr=str(a)
        dict['time']=astr
        dict['num']=random.randint(1,10)
        dic['res_data'].append(dict)
    print(dic)
    return json.dumps(dic)
    
    return jsonify("ok")
if __name__ == "__main__":
    hostname = socket.gethostname()
    ip='0.0.0.0'
    app.run( host=ip,port=5000,debug=False )

客戶端的HelloWorld.vue

<template>
  <div>
  <input v-model="beginTime" placeholder="edit me beginTime">
  <input v-model="endTime" placeholder="edit me endTime">
  <input v-model="selectContent" placeholder="edit me selectContent">
    <button @click="gettest">New random number</button>
    <button @click="get_id" id='is_id'>get_id</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      'id': '100010',
      'beginTime': '',
      'endTime': '',
      'selectContent': ''
    }
  },
  methods: {
    getHsonLength (json) {
      var jsonLength = 0
      for (var i in json) {
        jsonLength++
        var t
        t = i
        i = t
      }
      return jsonLength
    },
    gettest () {
      if (this.beginTime === '' || this.endTime === '' || this.selectContent === '') {
        alert('請將選項補全')
      } else {
        const path = 'http://localhost:5000/test'
        var dat = {'id': this.id, 'beginTime': this.beginTime, 'endTime': this.endTime, 'selectContent': this.selectContent}
        this.$axios.post(path, dat)
          .then(res => {
            alert(res.data.res_data[0].num)
          })
          .catch(error => {
            alert(error)
          })
      }
    },
    get_id (event) {
      alert(event.currentTarget.id)
      alert(event.currentTarget.innerText)
    }
  },
  created () {
    this.getRandom()
  }
}
</script>