結構:
/www
|
|-- /static
| |
| |-- echarts.js(固然還有echarts原dist目錄下的文件(夾))
|
|-- /templates
| |
| |-- index.html
|
|-- app.py
|
|-- create_db.pyjavascript
# create_db.py # 只運行一次!!! import sqlite3 # 鏈接 conn = sqlite3.connect('mydb.db') c = conn.cursor() # 建立表 c.execute('''DROP TABLE IF EXISTS weather''') c.execute('''CREATE TABLE weather (month text, evaporation text, precipitation text)''') # 數據 # 格式:月份,蒸發量,降水量 purchases = [('1月', 2, 2.6), ('2月', 4.9, 5.9), ('3月', 7, 9), ('4月', 23.2, 26.4), ('5月', 25.6, 28.7), ('6月', 76.7, 70.7), ('7月', 135.6, 175.6), ('8月', 162.2, 182.2), ('9月', 32.6, 48.7), ('10月', 20, 18.8), ('11月', 6.4, 6), ('12月', 3.3, 2.3) ] # 插入數據 c.executemany('INSERT INTO weather VALUES (?,?,?)', purchases) # 提交!!! conn.commit() # 查詢方式一 for row in c.execute('SELECT * FROM weather'): print(row) # 查詢方式二 c.execute('SELECT * FROM weather') print(c.fetchall()) # 查詢方式二_2 res = c.execute('SELECT * FROM weather') print(res.fetchall()) # 關閉 conn.close()
定義了兩個路由:'/'和'/weather',後一個用於處理ajax,返回json格式。形如:html
{month:['1月','2月',...],evaporation:[3.1, 4, 4.6, ...],precipitation:[...]}java
# app.py import sqlite3 from flask import Flask, request, render_template, jsonify app = Flask(__name__) def get_db(): db = sqlite3.connect('mydb.db') db.row_factory = sqlite3.Row return db def query_db(query, args=(), one=False): db = get_db() cur = db.execute(query, args) db.commit() rv = cur.fetchall() db.close() return (rv[0] if rv else None) if one else rv @app.route("/", methods=["GET"]) def index(): return render_template("index.html") @app.route("/weather", methods=["POST"]) def weather(): if request.method == "POST": res = query_db("SELECT * FROM weather") return jsonify(month = [x[0] for x in res], evaporation = [x[1] for x in res], precipitation = [x[2] for x in res]) if __name__ == "__main__": app.run(debug=True)
這裏使用單文件導入模式,見官網例子。python
值得注意的是導入echarts.js時使用了url_for函數。初時,我使用了src="js/echarts.js"
,總是導入不了!緣由不詳!jquery
index.html文件以下:ajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>ECharts Ajax</title> <script type="text/javascript" src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script> </head> <body> <!--Step:1 爲ECharts準備一個具有大小(寬高)的Dom--> <div id="main" style="height:500px;border:1px solid #ccc;padding:10px;"></div> <!--Step:2 引入echarts.js--> <!--<script src="js/echarts.js"></script>--> <script src="{{ url_for('static', filename='echarts.js') }}"></script> <script type="text/javascript"> // Step:3 爲模塊加載器配置echarts的路徑,從當前頁面連接到echarts.js,定義所需圖表路徑 require.config({ paths: { echarts: './static', } }); // Step:4 動態加載echarts而後在回調函數中開始使用,注意保持按需加載結構定義圖表路徑 require( [ 'echarts', 'echarts/chart/bar', // 按需加載 'echarts/chart/line', ], function (ec) { //--- 折柱 --- var myChart = ec.init(document.getElementById('main')); // 設置--------------------- var option = { tooltip : { trigger: 'axis' }, legend: { data:['蒸發量','降水量'] }, toolbox: { show : true, feature : { mark : {show: true}, dataView : {show: true, readOnly: false}, magicType : {show: true, type: ['line', 'bar']}, restore : {show: true}, saveAsImage : {show: true} } }, calculable : true, xAxis : [ { type : 'category', data : [] } ], yAxis : [ { type : 'value', splitArea : {show : true} } ], series : [ { name:'蒸發量', type:'bar', data:[] }, { name:'降水量', type:'line', data:[] } ] }; $.ajax({ cache: false, type: "POST", url: "/weather", //把表單數據發送到/weather data: null, // 發送的數據 dataType : "json", //返回數據形式爲json async: false, error: function(request) { alert("發送請求失敗!"); }, success: function(result) { //console.log(result); for (i = 0, max = result.month.length; i < max; i++) { //注意:result.month.length option.xAxis[0].data.push(result.month[i]); option.series[0].data.push(parseFloat(result.evaporation[i])); option.series[1].data.push(parseFloat(result.precipitation[i])); }; // 爲echarts對象加載數據-------------- myChart.setOption(option); } }); // 爲echarts對象加載數據-------------- //myChart.setOption(option); } ); </script> </body> </html>