Django 调试工具栏:如何分析文件下载?

Rex*_*exE 6 python django django-debug-toolbar

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

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

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

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

tim*_*haw 5

如果您专注于分析数据库查询,则另一种临时解决方案是不返回文件下载响应,而是加载模板(应用程序中的任何有效 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
Run Code Online (Sandbox Code Playgroud)

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


aro*_*cks 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';
Run Code Online (Sandbox Code Playgroud)

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