我一直在努力解决这个问题至少两天。 有一个视图可以生成一个页面,显示某个用户/电话分机所做的所有电话呼叫。没什么好看的,只有很长的页面,最多1000行。
此视图功能从网址接收一些参数,以便选择在此页面上显示的内容。有两种情况,一种是传递“extension = xxxxxx”,另一种是在网址中传递“user = xxxx”:
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 - 在John C建议强制评估查询集之后,加载时间从1.6分钟减少到14秒:现在我将调用转换为list(),然后将其传递给我自定义的render_to_response: < / p>
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:
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))
在我的开发机器中,根据针对 BOTH 情况的Chrome审核,完全处理此视图以获得真实数据方案需要3-4秒。在制作中,加载视图需要3-4秒才能在网址中传递用户参数,但是当扩展程序通过时,则需要2分钟!
编辑:重要的是说,在网址中传递用户或扩展之间的区别不会改变最终呈现的页面,除了顶部的一行我表示分机号码属于某人的时间。其余数据完全相同。
我描述了生成此视图所涉及的代码中的每个小块。我计算了生产代码中视图对render_to_response的持续时间(0.05秒)。我拿出了在我的模板中调用扩展名的部分,但没有成功。我还使用django_debug_toolbar来查看每个SQL语句正在执行的操作,最多查询需要2秒。
我还应该补充一点,我在生产设置上使用mod_wsgi, debug = False ... 尽管花了2分钟,YSlow仍将此页评为94分。
任何人都能解开一些光明吗?
答案 0 :(得分:2)
我没有看到任何明显错误的代码。我有一个问题是你期望一个对象匹配吗?如果是这样,可能值得尝试这段代码:
getData = request.GET.copy() # optional, I like my own copy.
if 'extension' in getData:
ext = getData['extension']
extObj = Extension.objects.get(number__exact=ext) # double-underline
# elif...
请注意,这将导致扩展对象,而不是Queryset。如果你有多个扩展程序,那么你需要使用过滤器 - 但我仍然建议使用 exact ,以及移动 ext 的读数从字典到过滤器语句之外。
更新(来自我的评论) - 尝试使用对list()的调用强制立即评估Queryset,看看它是否对render_to_response有影响。
更新2 - 因为确实有效 - 这就是我认为可能发生的事情。由于Django Querysets使用延迟评估,因此当模板最终执行时 - 它调用迭代器而不是现有列表。也许正在进行太多的函数调用,并且每次调用迭代器来获取新值都会产生大量不必要的开销。或者也许有一个错误。 :)