gpt4 book ai didi

python - Django - 生产中特定 View 的等待时间太长

转载 作者:行者123 更新时间:2023-12-02 07:07:45 32 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了至少两天。有一个 View 会生成一个页面,显示某个用户/电话分机调用的所有电话。没什么花哨的,只是一个很长的页面,最多 1000 行。

此 View 函数从 url 接收一些参数,以便选择在此页面上显示的内容。有两种情况,一种是在url中传递“extension=xxxxxx”,一种是在url中传递“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:

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))

根据 Chrome 对两种情况的审核,在我的开发计算机中,需要 3-4 秒才能完全处理此 View 以实现真实的数据场景。在生产中,在 URL 中传递 user 参数的情况下,加载 View 需要 3-4 秒,但是当传递 extension 时,需要 2 分钟!

编辑:重要的是要说的是,在 URL 中传递 userextension 之间的差异不会改变最终呈现的页面,除了顶部的一行指示分机号码从何时开始属于某人。其余数据完全相同。

我分析了代码中涉及生成此 View 的每个小块。我在生产代码中计算了 View 渲染到响应所需的时间(0.05 秒)。我取出了模板中调用 extension 的部分,但没有成功。我还使用 django_debug_toolbar 来查看每个 SQL 语句在做什么,查询最多需要 2 秒。

我还应该补充一点,我在生产设置中使用 mod_wsgi, debug=False...尽管花了 2 分钟,但 YSlow 将此页面评为 94。

有人可以透露一些信息吗?

最佳答案

我没有发现该代码有任何明显的错误。我的一个问题是,您是否期望一个对象完全匹配?如果是这样,可能值得尝试以下代码:

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...

请注意,这将产生扩展对象,而不是查询集。如果您有多个扩展名,那么您确实需要使用filter - 但我仍然建议使用exact,以及移动ext的读取em> 从字典到 filter 语句之外。

更新(来 self 的评论) - 尝试使用对 list() 的调用强制立即评估查询集,看看这是否对 render_to_response 产生影响。

更新 2 - 因为它确实产生了效果 - 这就是我认为可能发生的情况。由于 Django 查询集使用惰性求值,因此当模板最终执行时,它会调用迭代器,而不是现有列表。也许正在进行太多的函数调用,并且每次调用迭代器来获取新值都会产生大量不必要的开销。或者也许有一个错误。 :)

关于python - Django - 生产中特定 View 的等待时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050196/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com