Панель инструментов отладки Django: как профилировать загрузку файла?

Веб-приложение My Django позволяет пользователям загружать текстовые файлы, которые генерируются на лету:

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

Я установил панель инструментов отладки Django (0.11.0, так как не могу заставить работать 1.0.1), но когда я нажимаю, чтобы выполнить загрузку, на панели инструментов не отображается информация о загруженном файле, предположительно потому, что это отдельный страница/запрос (или, может быть, потому, что это не HTML-файл). Загруженный файл также не содержит отладочной информации.

Как я могу профилировать производительность загрузки этого файла?


person RexE    schedule 04.02.2014    source источник


Ответы (3)


Вы правы, это один из случаев, когда панель отладки не может вам помочь. Я бы порекомендовал использовать файлы журналов для определения времени ваших запросов. Например, если вы используете 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.

person arocks    schedule 04.02.2014

Альтернативное временное решение, если вы сосредоточены на профилировании запросов к БД, состоит в том, чтобы просто не возвращать ответ на загрузку файла, а вместо этого загружать шаблон (любой действительный шаблон 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, это может быть просто закомментирование вышеприведенного, а затем Django отобразит шаблон, как если бы действие загрузки не было выполнено. Или просто визуализируйте любой шаблон Django в своем приложении. Теперь откройте панель инструментов DDT — там все ваши запросы!

person timothyashaw    schedule 21.12.2018

Вы можете использовать django-debug-toolbar-force.

Это позволяет вам принудительно отображать шаблон для любого URL-адреса, добавляя ?debug-toolbar.

Это позволяет вам получить доступ к панели инструментов и всем ее инструментам во время разработки для любого представления без каких-либо изменений кода.

Предостережение: я не уверен, насколько активно он поддерживается на данный момент, последний коммит датирован 2020 годом.

person le.chris    schedule 01.06.2021