基于django业务的存储光交管理系统的的设计-菜鸟开发日记

django存储光交业务管理系统-菜鸟开发日记第九节-系统开发遇

2018-04-13  本文已影响32人  python菜鸟

性能篇:
针对模版内的模版语言,如果涉及的表太多,会导致特别慢,我刚开发打开一个存储的详细页面几乎用啦40秒,都是不可忍受的时间。



最开是是网页一次性全部展示,由于表之间关联性太强,导致打开一个网页结果运行啦几千条sql语句。果然是慢到极点。
模版语言使用太过,形成3表或者4表的查询结构。比如:

 {% for i in data%}
                        <tr>
                            <td>{{ i.index }}</td>
                            <td>{{ i.slot }}</td>
                            <td>{{ i.port }}</td>
                            <td class="am-hide-sm-only">{{ i.speed }}</td>
                            <td class="am-hide-sm-only">{{ i.type }}</td>
                            <td class="am-hide-sm-only">
                                {% if  i.wwn_set.all|length > 0 %}
                                    {% for k in  i.wwn_set.all  %}
                                        {{ k.wwn }}
                                    {% endfor %}
                                {% endif %}
                            </td>
                            <td class="am-hide-sm-only">{{ i.crc_err }}</td>
                            <td class="am-hide-sm-only">{{ i.tx }}</td>
                            <td class="am-hide-sm-only">{{ i.rx }}</td>
                            <td class="am-hide-sm-only">{{ i.TX_Power }}</td>
                            <td class="am-hide-sm-only">{{ i.RX_Power }}</td>
                            <td class="am-hide-sm-only">
                                {% if  i.wwn_set.all|length > 0 %}
                                    {% for k in  i.wwn_set.all  %}
                                        <a >{{ k.host_wwn }}</a>
                                    {% endfor %}
                                {% endif %}
                            </td>
                            <td class="am-hide-sm-only">
                                {% if  i.wwn_set.all|length > 0 %}
                                    {% for k in  i.wwn_set.all  %}
                                        <a data-am-popover="{content: '{{ k.wwnname }}{{ k.hostgroup_wwn }}', trigger: 'hover focus'}">{{ k.storage_wwn }}</a>
                                    {% endfor %}
                                {% endif %}
                            </td>
                        </tr>
                    {% endfor %}

通过这种方式的话基本上是作死,因该善用values:通过这个进行多表查询,效率比以上的强太多啦。

    st_log = models.Doment.objects.values("id","dotime","storage__ST_sn","storage__ST_ip","storage__ST_prodname","storage__ST_prodect").filter(
        Q(storage__ST_prodname="富士通") | Q(storage__ST_prodname="日立") | Q(storage__ST_prodname="华为") | Q(
            storage__ST_prodname="EMC"))

通过以上方案,速度基本达到啦5秒以内打开网站,但还是太慢。
再次采用异步的方式进行体现。
将所以的菜单进行异步获取,在views.py里面直接将html传回去。

def stroage_mess_host_rili_ajax(request):
    ret = {"status": True, "error": None, "data": None}
    if request.method == "POST":
        id = request.POST["id"]
        obj = models.STHOST.objects.filter(storage_id=id)
        html =""
        for i in obj:
            hostgoupname = ""
            for k in i.sthostgroup_set.all():
                hostgoupname += str(k.hostgroupname)
            wwn = ""
            sanwwn = ""
            rx = ""
            tx =""
            host = ""
            hostapp = ""
            for k in i.wwn_set.all():
                wwn += str(k.wwn) + "<br> "
                if k.Sanport_wwn:
                    sanwwn += str(k.Sanport_wwn.san) + " " + str(k.Sanport_wwn.slot) + "-" + str(k.Sanport_wwn.port) + "<br> "
                if k.Sanport_wwn:
                    rx += str(k.Sanport_wwn.rx) + "<br> "
                    tx += str(k.Sanport_wwn.tx) + "<br> "
                if k.host_wwn:
                    host += str(k.host_wwn) + "<br> "
                    hostapp += str(k.host_wwn.app) + "<br> "
            html += "<tr>" + \
                    "<td>" + str(i.id) +"</td>"+ \
                    "<td>" + str(i.hostname) +"</td>"  + \
                    "<td>" + str(i.Notes) +"</td>"  + \
                    "<td>" + wwn +"</td>"  + \
                    "<td>" + sanwwn +"</td>"  + \
                    "<td>" + rx +"</td>"  + \
                    "<td>" + tx +"</td>"  + \
                    "<td>" + host +"</td>"  + \
                    "<td>" + hostapp +"</td>"  + \
                    "</tr>"
    ret = {"status": True, "error": None, "data": html}

html内文件。

  $("#stroage_mess_work").click(function () {
            var id = $("#storage_id").text()
            $("#storage_work").empty()
            $('#waitting').modal({backdrop: 'static', keyboard: false},'toggle')
            $.ajax({
                url: "{% url "storage_work_ajax" %}",
                type: 'POST',
                data:{"id":id},
                success: function(data){
                    var obj = JSON.parse(data);
                    if(obj.status){
                        $("#storage_work").append(obj.data)
                        console.log(obj.data)
                        $('#waitting').modal('hide')
                    }else{
                        alert("error")
                        $('#waitting').modal('hide')
                    };
                }
            });
        });

最终通过以上方案,网页基本上是秒开,几乎不用等待,异步的话慢点,但也能5秒内打开。
明天继续



目录

django开发之存储光交业务管理系统第一节-序言

django存储光交业务管理系统第二节-pyhon脚本的编写

django存储光交业务管理系统第三节-系统初步分析需求

django存储光交业务管理系统第四节-光交数据库的设计

django存储光交业务管理系统第五节-存储数据库的设计

django存储光交业务管理系统第六节-系统的架构流程图

django存储光交业务管理系统第七节-程序的启动

django存储光交业务管理系统-菜鸟开发日记第八节-目录的结构说明

django存储光交业务管理系统-菜鸟开发日记第九节-系统开发遇到的坑

django存储光交业务管理系统-菜鸟开发日记第10节-业务图表需求

………………………………………………………………

上一篇下一篇

猜你喜欢

热点阅读