優化場景
利用檢視函式(views)查詢資料之後可以通過上下文context、字典、列表等方式將資料傳遞給HTML模板,由template引擎接收資料並完成解析。但是通過context傳遞資料可能就存在在不同的檢視函式中使用重複的查詢語句,所以可以通過將重複查詢語句設定全域性變數,配合locals()函式進行資料查詢與傳遞。
優化前
def index(request):
threatname = '威脅情報展示'
url = 'www.testtip.com'
allthreat = Threat.objects.all()
#推薦位的威脅情報
rec = Threat.objects.filter(rec__id=1)[:3]
#情報標籤
threat_tags = Tag.objects.all()
#將上述資料封裝至上下文中
context = {
'threatname': threatname,
'url': url,
'allthreat': allthreat,
'rec':rec,
'threat_tags':threat_tags,
}
#通過render傳遞上下文至模板templates
return render(request,'index.html',context)
def threatshow(request,tid):
allthreat = Threat.objects.all()
#推薦位的威脅情報
rec = Threat.objects.filter(rec__id=1)[:3]
#情報標籤
threat_tags = Tag.objects.all()
# 熱門情報資料
hot_threat = Threat.objects.filter(hot__id=x)[:6]
#將sitename&url&allarticle封裝至上下文中
context = {
'allthreat': allthreat,
'rec':rec,
'threat_tags':threat_tags,
'hot_threat':hot_threat,
}
return render(request, 'threatshow.html',context)
上面可以看到 views
裡面有 index()
和 threatshow()
兩個檢視函式,在這兩個檢視函式中有三個相同的資料查詢語句:
allthreat = Threat.objects.all()
#推薦位的威脅情報
rec = Threat.objects.filter(rec__id=1)[:3]
#情報標籤
threat_tags = Tag.objects.all()
優化後
設定全域性變數
# 全域性定義常用查詢資料引數
def global_variable(request):
allthreat = Threat.objects.all()
#推薦位的威脅情報
rec = Threat.objects.filter(rec__id=1)[:3]
#情報標籤
threat_tags = Tag.objects.all()
return locals()
views
中定義上述全域性變數後,通過locals()函式優化如下:
def index(request):
threatname = '威脅情報展示'
url = 'www.testtip.com'
#通過render傳遞上下文至模板templates
return render(request,'index.html',locals())
def threatshow(request,tid):
# 熱門情報資料
hot_threat = Threat.objects.filter(hot__id=x)[:6]
return render(request, 'threatshow.html',locals())
Python
中的locals()
函式會以字典型別返回當前位置的全部區域性變數,也就是返回當前index()
、threatshow()
檢視函式中定義的區域性資料查詢結果,加上全域性變數當中已經完成了其他剩餘資料查詢,所以在滿足資料查詢需求的基礎上完成了檢視函式優化。