我一直在爲這個問題摔角至少兩天。 有一個視圖會生成一個頁面,顯示某個用戶/電話分機所做的所有電話呼叫。沒有什麼奇特的,只有很長的一頁,最多1000行。Django - 生產中特定視圖的等待時間需要很長的時間
此視圖函數從url中接收一些參數,以便選擇要在此頁面上顯示的內容。有兩種情況,一個地方的「延長= XXXXXX」傳遞和一個其中「user = XXXX」中的URL傳遞:
if request.GET.get("extension", None):
# extension_query expects only one Extension object
extension_query = Extension.objects.filter(number=request.GET["extension"])
... # Here I do some conditionals to match the right Extension object.
elif request.GET.get("user", None):
... # Simple stuff, nothing to significant.
# at the end I call render_to_response normally
編輯 - 這是一段調用我的自定義選擇render_to_response代碼:
EDIT2 - 迫使查詢集的評價約翰·C·的建議後,加載時間從1.6分鐘減少到14秒:
if (request.GET.get("format", None) == "screen"
or request.GET.get("print", False)):
ctx = dict(calls=list(calls), client=client, extension=extension,
no_owner_extension=no_owner_extension,
start=start_date, end=end_date, tab="clients",
owner=user)
return finish_request(
request, "reports/exporting_by_call_type.html", ctx)
:現在我把它傳遞給我的定製選擇render_to_response前投我的調用列表()
這是我定製的render_to_response:
def finish_request(request, template, context):
if "print" in request.GET or "print" in request.POST:
context.update(printing=True)
return render_to_response(
template, RequestContext(request, context))
在我的機器,它需要3-4秒,根據Chrome的審計工作BOTH情況完全處理這一觀點的現實數據的情況。在生產中,加載視圖的時間需要3-4秒,其中用戶參數在URL中傳遞,但當擴展通過時,需要2分鐘!
編輯:這說的是,在URL傳球用戶或擴展之間的區別並不在頂部,因爲當分機號碼屬於別人的,我表示改變最終呈現的頁面,除了一條線是非常重要的。其餘的數據是完全一樣的。
我在我的代碼中描述了生成這個視圖的每個小塊。我計算了視圖在我的生產代碼中需要多長時間render_to_response(0.05秒)。我拿出分機的部分在我的模板中被調用但沒有成功。我還使用django_debug_toolbar查看每個SQL語句正在做什麼,最多隻需2秒。
我還要補充一點,我使用的mod_wsgi,調試=我的製作設置假 ... YSlow的利率這個頁面94儘管採取2分鐘。
任何人都可以點亮一下嗎?
小調 - 在瀏覽Django文檔時,我注意到[repr()](https://docs.djangoproject.com/en/1.3/ref/models/querysets/#when-querysets-are - 評估)Queryset函數,它強制對查詢集進行評估,但是*沒有*將它變成列表。在你(或某人)不希望*列表*,但仍然想要強制對查詢集進行評估的情況下,這是一個選項。 – 2011-08-24 20:14:20