Django uses pyecharts to realize the national ping delay map display

The final effect is as follows:

insert image description here

1. Django implementation code

The settings are configured as follows:

pingTool is my app

insert image description here

The url code under pingTool is as follows:

from django.urls import re_path as url
from pingTool import views
from django.urls import path

urlpatterns = [
    path('map/', views.MapView.as_view()),
    path('mapresult/', views.mapClient.as_view()),
]

The views code is as follows:

from django.shortcuts import render
import json
import time
from random import randrange

from django.http import HttpResponse
from rest_framework.views import APIView

from pyecharts.charts import Bar, Line, Map
from pyecharts import options as opts
from pingTool import models
from tools.ping import pingIp, yd_data, lt_data, dx_data
from pyecharts.faker import Faker


def response_as_json(data):
    json_str = json.dumps(data)
    response = HttpResponse(
        json_str,
        content_type="application/json",
    )
    response["Access-Control-Allow-Origin"] = "*"
    return response


def json_response(data, code=200):
    data = {
    
    
        "code": code,
        "msg": "success",
        "data": data,
    }
    return response_as_json(data)


def json_error(error_string="error", code=500, **kwargs):
    data = {
    
    
        "code": code,
        "msg": error_string,
        "data": {
    
    }
    }
    data.update(kwargs)
    return response_as_json(data)


JsonResponse = json_response
JsonError = json_error

def map():
	# 获取各个省份运营商的ping延迟数据
    yd_provinces, yd_values = yd_data()
    lt_provinces, lt_values = lt_data()
    dx_provinces, dx_values = dx_data()
    m = (
        Map()
        .add("移动", [list(z) for z in zip(yd_provinces, yd_values)], "china")
        .add("联通", [list(z) for z in zip(lt_provinces, lt_values)], "china")
        .add("电信", [list(z) for z in zip(dx_provinces, dx_values)], "china")
        # .add("电信", [list(z) for z in zip(Faker.provinces, Faker.values())], "china")
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="ping全国延迟", subtitle=time.strftime('%Y-%m-%d %H:%M'), pos_left='center'),
            visualmap_opts=opts.VisualMapOpts(
                min_=0,
                max_=200,
                is_piecewise=True,
                split_number=5,
                range_text=['高', '低'],
                pieces=[
                    {
    
    "min": 0, "max": 20},
                    {
    
    "min": 20, "max": 40},
                    {
    
    "min": 40, "max": 80},
                    {
    
    "min": 80, "max": 160},
                    {
    
    "min": 200, "max": 2000},
                ]
            ),
            toolbox_opts=opts.ToolboxOpts(
                is_show=True, orient='vertical', pos_top='middle', pos_left="90%"),
            legend_opts=opts.LegendOpts(pos_left='left', orient='vertical')
        )
        .dump_options_with_quotes()
    )
    return m

class MapView(APIView):
    def get(self, request, *args, **kwargs):
        return JsonResponse(json.loads(map()))


class mapClient(APIView):
    def get(self, request, *args, **kwargs):
        return HttpResponse(content=open("./templates/map.html", encoding='utf-8').read())

This project uses python's pythonping package to extract ping data from pythonping import ping. The custom ping code is as follows:

import re
import time
import json
from pythonping import ping
from pyecharts.faker import Faker



# 读取省份运营商的ip信息
with open("tools/provinceIP", 'r', encoding='utf-8') as f:
    content = json.loads(f.read())

# 获取省份的ping数据
def get_provincesData(IP):
    ip_data = ping(IP, count=5, verbose=False)
    return ip_data

# 移动延迟数据
def yd_data():
    value = []
    yd_province = content['移动']['province']
    yd_ip = content['移动']['IP']
    for ip in yd_ip:
        data = get_provincesData(ip)
        value.append(data.rtt_avg_ms)
    return yd_province, value

# 联通延迟数据
def lt_data():
    value = []
    lt_province = content['联通']['province']
    lt_ip = content['联通']['IP']
    for ip in lt_ip:
        data = get_provincesData(ip)
        value.append(data.rtt_avg_ms)
    return lt_province, value

# 电信延迟数据
def dx_data():
    value = []
    dx_province = content['电信']['province']
    dx_ip = content['电信']['IP']
    for ip in dx_ip:
        data = get_provincesData(ip)
        value.append(data.rtt_avg_ms)
    return dx_province, value

The front-end code is as follows:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="/static/icon/favicon.ico">
    <title>ping</title>
    <link href="/static/css/bootstrap.min.css" rel="stylesheet">
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
    <!-- 如果地图不显示需要添加此行 -->
    <script type="text/javascript" src="https://assets.pyecharts.org/assets/maps/china.js"></script>
</head>

<body>
    <div class="container">
        <br>
        <div id="map" style="width:1100px; height:800px;"></div>
    </div> <!-- /container -->
    <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
    <script src="/static/js/bootstrap.min.js"></script>
    <script src="/static/js/ie10-viewport-bug-workaround.js"></script>
    <script>
        var chart = echarts.init(document.getElementById('map'), 'white', {
    
     renderer: 'canvas' });

        $(
            function () {
    
    
                fetchData(chart);
                // setInterval(fetchData, 2000); //定时刷新
            }
        );

        function fetchData() {
    
    
            $.ajax({
    
    
                type: "GET",
                url: "http://127.0.0.1:8000/pingTool/map",
                dataType: 'json',
                success: function (result) {
    
    
                    chart.setOption(result.data);
                }
            });
        }
    </script>
</body>

</html>

The ip configuration of each province provinceIPis as follows:

{
    
    
    "移动": {
    
    
        "province": [
            "广东省",
            "北京市",
            "上海市",
            "江西省",
            "湖南省",
            "浙江省",
            "江苏省",
            "天津市",
            "河北省",
            "山西省",
            "内蒙古自治区",
            "辽宁省",
            "吉林省",
            "黑龙江省",
            "安徽省",
            "福建省",
            "山东省",
            "河南省",
            "湖北省",
            "广西壮族自治区",
            "海南省",
            "重庆市",
            "四川省",
            "贵州省",
            "云南省",
            "西藏自治区",
            "陕西省",
            "甘肃省",
            "青海省",
            "宁夏回族自治区",
            "新疆维吾尔自治区"
        ],
        "IP": [
            "120.236.14.140",
            "211.137.30.66",
            "211.136.150.66",
            "211.141.85.68",
            "211.142.210.99",
            "112.17.42.34",
            "221.181.240.134",
            "117.131.207.245",
            "111.11.25.114",
            "183.203.27.146",
            "218.202.136.82",
            "211.180.241.18",
            "211.141.0.99",
            "218.203.48.113",
            "221.176.18.6",
            "211.138.159.138",
            "120.192.93.11",
            "221.176.102.14",
            "111.47.196.22",
            "211.138.250.154",
            "221.176.98.146",
            "218.201.32.193",
            "117.177.219.70",
            "211.139.13.137",
            "218.202.0.1",
            "111.11.238.150",
            "120.192.247.134",
            "117.156.6.62",
            "211.138.75.123",
            "221.176.15.45",
            "221.181.62.218"
        ]
    },
    "联通": {
    
    
        "province": [
            "广东省",
            "北京市",
            "上海市",
            "江西省",
            "湖南省",
            "浙江省",
            "江苏省",
            "天津市",
            "河北省",
            "山西省",
            "内蒙古自治区",
            "辽宁省",
            "吉林省",
            "黑龙江省",
            "安徽省",
            "福建省",
            "山东省",
            "河南省",
            "湖北省",
            "广西壮族自治区",
            "海南省",
            "重庆市",
            "四川省",
            "贵州省",
            "云南省",
            "西藏自治区",
            "陕西省",
            "甘肃省",
            "青海省",
            "宁夏回族自治区",
            "新疆维吾尔自治区"
        ],
        "IP": [
            "58.252.2.194",
            "202.106.0.20",
            "219.158.7.85",
            "58.17.1.34",
            "110.53.247.30",
            "124.160.82.194",
            "58.241.0.1",
            "117.8.222.106",
            "121.17.126.1",
            "218.26.27.214",
            "202.99.226.78",
            "113.230.172.58",
            "125.32.127.2",
            "61.167.6.130",
            "58.242.193.74",
            "58.22.110.138",
            "119.188.185.70",
            "61.168.37.62",
            "58.19.112.133",
            "121.31.33.82",
            "221.11.154.74",
            "221.5.232.11",
            "119.6.117.94",
            "43.254.100.6",
            "221.3.139.11",
            "221.13.95.110",
            "123.139.1.106",
            "60.13.16.126",
            "221.207.63.22",
            "221.199.1.46",
            "221.7.2.25"
        ]
    },
    "电信": {
    
    
        "province": [
            "广东省",
            "北京市",
            "上海市",
            "江西省",
            "湖南省",
            "浙江省",
            "江苏省",
            "天津市",
            "河北省",
            "山西省",
            "内蒙古自治区",
            "辽宁省",
            "吉林省",
            "黑龙江省",
            "安徽省",
            "福建省",
            "山东省",
            "河南省",
            "湖北省",
            "广西壮族自治区",
            "海南省",
            "重庆市",
            "四川省",
            "贵州省",
            "云南省",
            "西藏自治区",
            "陕西省",
            "甘肃省",
            "青海省",
            "宁夏回族自治区",
            "新疆维吾尔自治区"
        ],
        "IP": [
            "218.17.216.171",
            "220.181.22.1",
            "218.1.104.1",
            "202.101.224.68",
            "124.232.140.18",
            "220.191.157.26",
            "61.177.113.130",
            "219.150.37.106",
            "27.129.1.166",
            "202.100.4.1",
            "121.56.32.1",
            "219.148.254.186",
            "222.168.78.10",
            "219.147.146.62",
            "220.178.0.1",
            "222.77.191.42",
            "150.138.192.110",
            "171.8.240.250",
            "111.175.223.246",
            "58.59.133.1",
            "218.77.136.195",
            "119.84.89.45",
            "118.123.217.102",
            "203.174.4.11",
            "112.117.212.11",
            "219.151.32.85",
            "61.134.1.125",
            "61.178.3.117",
            "202.100.149.50",
            "124.224.255.55",
            "222.83.13.6"
        ]
    }
}

Guess you like

Origin blog.csdn.net/weixin_43883625/article/details/130114009