【发布时间】:2019-05-05 03:35:35
【问题描述】:
My site 有一个带有高级搜索小部件的导航栏(在搜索字段旁边),它呈现在每个页面上。对于每个请求,context_processor 创建表单,以便它可以在导航栏中的该页面上可用。这个表格有大约十几个选项,总共有几百个选项。其中大部分选项是针对货币和国家/地区选择的,还有大约 80 个其他选项。 “商店”还有一个更大的列表,但它是通过 AJAX 加载的,所以这里不应该是一个因素。
在 Django 1.8 上性能很好,但在升级到 1.11 (Pyton 2.7.15) 后,我注意到在 NewRelic 中,我最频繁的请求现在使用了超过 500 毫秒:
- 渲染/django/forms/widgets/select_option.html
- 渲染/django/forms/widgets/select.html
- 渲染/django/forms/widgets/attrs.html
这似乎与 1.11 对 Template-based Widget Rendering (docs) 的更改有关,但是我能找到的唯一讨论相关问题的页面是关于我没有在生产中运行的 Django Toolbar。
我正在并且已经在使用缓存模板加载器(现在是默认设置),但是我不知道这是否有帮助。我无法轻松缓存此表单,因为正如您在代码中看到的那样,我根据请求设置了许多默认值。
为什么我的表单会因这种变化而受到如此严重的影响?消除两个较大的选择会有所帮助,但肯定数百个选项不应该花这么长时间来呈现,所以在我看来,存在一个潜在的问题,即数量只是在加剧。
这里是完整表单和 html 代码的链接。 (稍后我们确定问题时,我将在问题中包含 sn-ps,以供将来的读者使用。
更新
在这篇文章之后,我禁用了这些选择中最大的一个,并且一瘸一拐地过了一年。本周我实施了一个解决方法,这样我就可以重新启用这些选项而无需支付巨大的成本。我现在缓存表单的模板片段,将选定的表单搜索选项传递给前端,并使用 JavaScript 进行设置。
【问题讨论】:
标签: html django forms python-2.7 performance