Django+Echarts进行可视化以及其整合通过ssh隧道连接mysql

Django和ECharts的串儿

      • 技术准备
          • Django:
          • Echarts下载:
      • 开始项目

技术准备

Django:

https://www.djangoproject.com/start/

Echarts下载:

https://github.com/apache/incubator-echarts/tags 选择版本之后解压

开始项目

1、pip install Django
2、Django 开启项目:进入你想要创建项目的目录,执行

django-admin startproject    projectname

3、进入你的项目目录,创建一个application

django-admin startapp appname

4、修改配置
主要是修改以下几个位置:

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
	#这个列表的最后一行添加你的APP的名字
    'BI_main_APP',
]
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
#由于我还要执行SQL语句,但是SQL语句都比较长,写在程序里显得冗余,于是自定义了一个参数SQL_PATH
SQL_PATH = os.path.join(BASE_DIR,'BI_main_APP/SQLs')
想要调用它只需要
from projectname.settings import *
就可以了
由于此项目并不会忘数据库存东西(暂时),所以也就没有配置数据库配置

5、路由配置
6、视图

import json
from django.shortcuts import render
from llj_eBI.settings import *
import pandas
from BI_main_APP import SQLEngine
def test(request):
    ###读取sql
    with open(os.path.join(SQL_PATH,'llj_statistics/drop_every_store/chaobei'),'r') as f:
        sql = f.read()
    ###创建sql引擎
    engine =SQLEngine.llj_statistics_engine().create_engine()
    ###执行sql
    data = pandas.read_sql(sql,engine)
    ###关闭ssh通道
    SQLEngine.server.close()
    dataDict = {
        """此字典为传到模板的json数据"""

    }
    ####注意传到模板的时候要用json.dumps将字典转化为字符串,注意ensure_ascii=False以免模板解析时报错
    return render(request,'drop/chaobei.html',{'context':json.dumps(dataDict,ensure_ascii=False)})

我们创建了一个SQLEngine模块来建立带ssh通道的sql引擎,具体如下:

import pymysql
from sshtunnel import SSHTunnelForwarder
####连接引擎
###单例字典
_instance = {}
server = SSHTunnelForwarder(
         ('ssh机ip', 22),  # B机器的配置
         ssh_password='password',
         ssh_username='root',
         remote_bind_address=('数据库ip', 3306)) # A机器的配置
####单例模式装饰器
def singleton(cls):
 global _instance
 def inner():
     if cls not in _instance:
         _instance[cls] = cls()
     return _instance[cls]
 return inner

##基础连接类
class baseEngine(object):
 def __init__(self):
     self.dbname= None
 def create_engine(self):
     server.start()
     mysql_connect_engine = pymysql.connect(host='127.0.0.1',  # 此处必须是是127.0.0.1
                                            port=server.local_bind_port,
                                            user='mysqluser',
                                            passwd='mysqlpassword',
                                            db=self.dbname)
     return mysql_connect_engine

@singleton
class llj_statistics_engine(baseEngine):
 def __init__(self):
     self.dbname = 'tablename'

需要注意的是,在使用完return出去的sql连接对象时,要记得关闭ssh通道。

7、模板
根据ECharts官网的例子,我们可以照葫芦画瓢,因为只有一个图,所以也就没有再建立js文件。当然,我们需要把ECharts放到我们当前的项目目录下,然后将其导入到我们的模板中。注意,echarts.js并不是ECharts主目录的那个,而是/echarts/dist/echarts.js

<!DOCTYPE html>
<html>
<head>
    {% load staticfiles %}
    <meta charset="utf-8">
    <!-- 引入 ECharts 文件 -->
    <script src={% static 'BI_main_APP/utils/echarts/dist/echarts.js' %}></script>
     <div style="border:2px solid #666;width:100%;height:1000px;float:left" id="chartmain"></div>
    <script type="text/javascript">
        var context = {{ context|safe }};
        var myChart = echarts.init(document.getElementById('chartmain'));
        //配置对象
        var option = {
            title:{
                text:context["title"]
            },
            legend:{
                data:context['legend']
            },
            xAxis:{
                data:context['xAxis']['data']
            },
            yAxis:{},
            series:[
                context['series']
            ]
        };
        myChart.setOption(option);
    </script>
</head>
</html>

以上就是本篇文章的内容,略显潦草,希望能帮助大家解决ssh通道连接mysql的问题。

你可能感兴趣的:(Django+Echarts进行可视化以及其整合通过ssh隧道连接mysql)