【问题标题】:Django REST framework is slowDjango REST框架很慢
【发布时间】:2012-10-25 23:27:00
【问题描述】:

我开始使用 Django REST 框架为生产做准备,但不幸的是,它的执行速度很慢。

我正在调用一个包含 500 个字典的数组,每个字典都有 5 个键值对。在 shell 中,调用时间根本不明显——你按下回车键,它就完成了。以前,当我在没有 REST 框架的情况下直接提供相同的内容时,也没有明显的延迟。但是,使用 REST 框架,页面呈现后大约需要 1 到 2 秒才能显示内容。

我不认为这是由于 javascript,因为通过可浏览 API 访问相同的细节会导致类似的延迟。

另外,我目前缓存。

【问题讨论】:

  • 您是否尝试过分析视图以查看占用时间的内容?我以前用this decorator 来分析视图。
  • 您是否尝试回滚到以前的解决方案并执行相同的 API 调用?它可能与图书馆无关。
  • @Torsten - 刚刚确认直接调用 postgresql 要快得多。我会确认它是否是 JS,但再次,由于访问内置可浏览 API 的速度同样慢,我觉得可能是 DRF。
  • 您是否尝试过在响应(在 shell 中)上运行 simplejson.dumps 以查看它实际序列化为 json 的速度?如果还是很慢,你可能需要使用simplejson C extension,如果不是,请测试直接http请求调用时DRF的响应(例如,使用curlpython-requests

标签: django rest django-rest-framework


【解决方案1】:

其他人无法根据问题中给出的详细信息为您调试。

  • 您是重用现有的通用视图还是编写自己的视图?
  • 您是否对数据进行序列化,如果是,您的序列化程序定义是什么样的?
  • 问题是在呈现为 JSON 时出现,还是仅在呈现为 Browsable API 时出现?
  • 您提到在没有 REST 框架的情况下提供内容 - 视图之前是什么样的,之后又是什么样的?

REST 框架视图微不足道,因此请使用分析工具,或者简单地覆盖它们并添加一些时间。同样,渲染器是微不足道的 - 子类化您目前使用的任何渲染器,覆盖 .render() 并在调用父级的 .render() 方法的任一侧添加几个计时调用。

如果您认为您已将问题缩小到特定领域,那么请组合一个最小的测试用例并将其作为问题提交。

序列化本身不太可能成为问题,我使用相同的序列化引擎来复制 Django 的夹具转储,并且没有明显的退化。

如果您要跨模型关系进行查找,则可能需要在构造查询集时添加 .select_related().prefetch_related() 调用,就像使用任何其他 Django 视图一样。


编辑:请注意,在这篇文章之后,序列化程序的速度得到了显着改进,as noted in this ticket

【讨论】:

  • 谢谢!如果还有问题,我会尝试一下并在 GH 上提交问题。
  • 我使用的通用视图前后是一样的。我在查询集中添加了一个 prefetch_related() 并得到了与 DRF 相同的延迟。将介绍和更新。
  • 只是另一个更新:我已经用tastepie 测试了相同的设置,它的加载速度非常快。但是,我仍然会尝试调试它,因为我希望将来使用 DRF。
  • 如果您可以发布一些示例代码来演示您所看到的问题,我会尝试对其进行调查。
猜你喜欢
  • 1970-01-01
  • 2022-01-25
  • 2016-05-03
  • 2015-10-10
  • 2020-12-22
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多