性能篇:
針對模版內(nèi)的模版語言璃赡,如果涉及的表太多沃饶,會導(dǎo)致特別慢,我剛開發(fā)打開一個存儲的詳細(xì)頁面幾乎用啦40秒,都是不可忍受的時間热芹。
最開是是網(wǎng)頁一次性全部展示秤掌,由于表之間關(guān)聯(lián)性太強(qiáng)恒傻,導(dǎo)致打開一個網(wǎng)頁結(jié)果運(yùn)行啦幾千條sql語句澈驼。果然是慢到極點(diǎn)。
模版語言使用太過耘沼,形成3表或者4表的查詢結(jié)構(gòu)极颓。比如:
{% 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:通過這個進(jìn)行多表查詢群嗤,效率比以上的強(qiáng)太多啦菠隆。
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"))
通過以上方案,速度基本達(dá)到啦5秒以內(nèi)打開網(wǎng)站狂秘,但還是太慢骇径。
再次采用異步的方式進(jìn)行體現(xiàn)。
將所以的菜單進(jìn)行異步獲取者春,在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內(nèi)文件。
$("#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')
};
}
});
});
最終通過以上方案钱烟,網(wǎng)頁基本上是秒開晰筛,幾乎不用等待嫡丙,異步的話慢點(diǎn),但也能5秒內(nèi)打開读第。
明天繼續(xù)
目錄
django開發(fā)之存儲光交業(yè)務(wù)管理系統(tǒng)第一節(jié)-序言
django存儲光交業(yè)務(wù)管理系統(tǒng)第二節(jié)-pyhon腳本的編寫
django存儲光交業(yè)務(wù)管理系統(tǒng)第三節(jié)-系統(tǒng)初步分析需求
django存儲光交業(yè)務(wù)管理系統(tǒng)第四節(jié)-光交數(shù)據(jù)庫的設(shè)計
django存儲光交業(yè)務(wù)管理系統(tǒng)第五節(jié)-存儲數(shù)據(jù)庫的設(shè)計
django存儲光交業(yè)務(wù)管理系統(tǒng)第六節(jié)-系統(tǒng)的架構(gòu)流程圖
django存儲光交業(yè)務(wù)管理系統(tǒng)第七節(jié)-程序的啟動
django存儲光交業(yè)務(wù)管理系統(tǒng)-菜鳥開發(fā)日記第八節(jié)-目錄的結(jié)構(gòu)說明
django存儲光交業(yè)務(wù)管理系統(tǒng)-菜鳥開發(fā)日記第九節(jié)-系統(tǒng)開發(fā)遇到的坑
django存儲光交業(yè)務(wù)管理系統(tǒng)-菜鳥開發(fā)日記第10節(jié)-業(yè)務(wù)圖表需求
………………………………………………………………