6

我的 Django webapp 允许用户下载动态生成的文本文件:

response = HttpResponse(my_file_contents)
response['Content-Disposition'] = 'attachment; filename="my file.txt"'
return response

我安装了 Django 调试工具栏(0.11.0,因为我无法让 1.0.1 工作),但是当我单击进行下载时,工具栏没有显示有关已下载文件的信息,大概是因为这是一个单独的页面/请求(或者可能因为它是一个非 HTML 文件)。下载的文件也不包含任何调试信息。

如何分析此文件下载的性能?

4

3 回答 3

4

如果您专注于分析数据库查询,另一种临时解决方案是不返回文件下载响应,而是加载模板(应用程序中的任何有效 Django 模板都应该工作)。DDT 仍会记录所有查询,您可以在后续页面上看到它们。这很有效,因为您通常感兴趣的是为了构建准备下载的数据而发生的查询。获取一些已经在手的数据并返回响应的实际过程通常非常快。

因此,假设您有一个可以请求此下载的表单。通常,您的视图会返回如下内容:

# (Do something here to collect data)
response = HttpResponse(export_data, content_type=content_type)
response['Content-Disposition'] = 'attachment; filename=somefile.txt'
return response

只需将其注释掉并返回一个常规渲染的模板——如果你不想显示数据,你就不需要显示数据。如果使用像 TemplateView 或 FormView 这样的 mixin,这可能只是简单地注释掉上面的内容,然后 Django 将呈现模板,就好像没有执行下载操作一样。或者,只需在您的应用程序中呈现任何 Django 模板。现在,打开 DDT 工具栏——有你所有的查询!

于 2018-12-21T22:22:32.623 回答
1

你是对的,这是调试工具栏无法帮助你的情况之一。我建议使用日志文件来计算您的请求时间。例如,如果您使用的是 Nginx,那么您可以使用它的语法向日志文件添加额外信息。例如,以下行添加了每个请求的响应时间:

log_format timed_combined '$remote_addr - $remote_user [$time_local]  '
      '"$request" $status $body_bytes_sent '
      '"$http_referer" "$http_user_agent" '
      '$request_time $upstream_response_time $gzip_ratio';

如果您更喜欢 Django 应用程序解决方案,可以查看django-timelog

于 2014-02-04T09:02:57.553 回答
0

您可以使用django-debug-toolbar-force

它允许您通过附加?debug-toolbar.

这使您可以在开发任何视图的过程中访问工具栏及其所有工具,而无需更改任何代码。

警告:我不确定到目前为止它的维护情况如何,最后一次提交是从 2020 年开始的。

于 2021-06-01T13:49:52.790 回答