django - 在可能需要完全显示的大型请求文件的情况下的最佳实践
问题描述
案子
我正在使用 Angular@6 和 Django@2.2 实现一个 Web 应用程序。在我的应用程序中,我为用户提供了一个带有选项的表单。根据选择的选项,我向后端请求相关结果。结果是 {orderNumer: integer, message: string} 形式的行。后端响应的行数范围从 0 到 20k。
问题和我做了什么
我目前正在使用 Angular Material Table,从 django 请求整个文件(无流式传输),并且由于 angular 得到结果,我将它们传递到 angular 材质表中。
问题是在 14k 行的情况下,表格会延迟 12 秒显示此结果。我的意思是,从 Django 将所有 14k 行提取到 Angular 时,需要 12 秒才能显示。
一些限制
我注意到分页,即当用户滚动或进入下一页结果时请求块中的数据。但是,这不是我的应用程序中想要的行为。我希望用户能够下载结果,而不必一次又一次地向下滚动或进入下一页。
问题
在这种情况下有哪些最佳实践?
1)我是否将结果部分加载到角度材料表中?有办法吗?
2)从后端流式传输行而不是请求整个文件时我该怎么办?在这种情况下,我是否应该独立于文件大小来执行此操作?
解决方案
花费最多时间的是不下载阵列,甚至不通过它。将 HTML 元素添加到 DOM 需要 12 秒。
所以,这就是我在这种情况下会做的事情:
下载数组(即使是 14K 行,我认为不需要流式传输)
将子数组存储在变量中,然后
ng-for-trackBy
出于性能原因显示此子数组(并在用户靠近显示数组的底部时添加添加行所需的代码)- 使用 OnPush 更改检测策略,也是出于性能原因(https://angular.io/api/core/ChangeDetectionStrategy)
或者:
- 下载数组
- 通过利用 Angular CDK ( https://material.angular.io/cdk/scrolling/overview )使用虚拟滚动列表
希望能帮助到你,
推荐阅读
- laravel - 未找到模块:错误:无法解析“计时器”
- mysql - MySQL 加载数据本地字段终止给出错误
- python - 使用函数简化代码块 [Python]
- datagrid - DataGrid material-ui 禁用退格和删除列中的键
- json - 如何将带有 Emoji 的 JSON 响应保存为 Unicode?
- go - Go中的同步条件语句
- javascript - Nextjs:根据用户数据渲染页面或显示404页面
- mysql - 使用 MySQL 的 F# 程序的基本模型
- regex - gawk gensub 正则表达式,我如何用背靠背的类似捕获组替换一个或多个
- pyspark - 如何在 GCS 中的增量表之上创建 BQ 外部表并仅显示最新快照