【问题标题】:Django-debug-toolbar-line-profiler shows only a single line of output, no contentDjango-debug-toolbar-line-profiler 只显示单行输出,没有内容
【发布时间】:2014-05-10 01:06:42
【问题描述】:

我有一个 Raspberry Pi 坐在偏远的地方。它连接到一个小型自制电路和一个温度探头。我已经设置了 Raspberry Pi 来做一些事情:

  • 每小时运行 cron 作业以获取温度读数并将其本地存储到 sqlite 数据库中
  • 运行 Nginx 网络服务器
  • 运行 uwsgi 应用服务器
  • 提供一个简单的 Django 应用程序

在那个 Django 应用程序中,我有一个执行以下操作的简单视图:

  1. 点击 DB 以获取最后 300 次温度记录
  2. 将它们放入 Pandas DataFrame
  3. 使用 Matplotlib 生成近期温度历史记录的精美 SVG 图表
  4. 填写一个简单的模板,该模板显示 SVG 以及最近温度读数的小型 HTML 表格。

渲染此视图大约需要 30 秒。很长一段时间。所以我想看看是什么花了这么长时间。我的猜测是所有与生成图形相关的工作。但为了找出答案,我想做一些分析。

我使用 pip 安装了 django-debug-toolbardjango-debug-toolbar-line-profiler

我已根据我所了解的文档对它们进行了配置。特别是,我设置了:

DEBUG = True
TEMPLATE_DEBUG = DEBUG
DEBUG_TOOLBAR_PATCH_SETTINGS = False

MIDDLEWARE_CLASSES = (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

DEBUG_TOOLBAR_PANELS = (
    'debug_toolbar.panels.versions.VersionsPanel',
    'debug_toolbar.panels.timer.TimerPanel',
    'debug_toolbar.panels.settings.SettingsPanel',
    'debug_toolbar.panels.headers.HeadersPanel',
    'debug_toolbar.panels.sql.SQLPanel',
    'debug_toolbar.panels.staticfiles.StaticFilesPanel',
    'debug_toolbar.panels.templates.TemplatesPanel',
    'debug_toolbar.panels.cache.CachePanel',
    'debug_toolbar.panels.signals.SignalsPanel',
    'debug_toolbar.panels.logging.LoggingPanel',
    'debug_toolbar.panels.redirects.RedirectsPanel',

    'debug_toolbar_line_profiler.panel.ProfilingPanel',
)

另外,INTERNAL_IPS也设置正确。

我使用基于类的视图构建了我的视图。它看起来像这样:

from django.views.generic import TemplateView
from XXXX.models import TempReading, TempSeries
import numpy as np
import pandas as pd
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
import seaborn as sbn
import StringIO

class TestView(TemplateView):
    template_name = 'XXXX/test.html'

    def get_context_data(self, **kwargs):
        upstairs = TempSeries.objects.get(name='Upstairs')
        upstairstemps = upstairs.tempreading_set.all().order_by('-timestamp')[:300]

        frame = pd.DataFrame(list(upstairstemps.values()))
        frame.set_index('timestamp', inplace=True)

        # matplotlib.rcParams['svg.fonttype'] = 'none'

        fig = Figure()
        ax = fig.add_subplot(1,1,1)
        frame['value'].plot(ax=ax)
        ax.get_xaxis().grid(color='w', linewidth=1)
        ax.get_yaxis().grid(color='w', linewidth=1)

        fig.set(facecolor='w')
        canvas = FigureCanvas(fig)

        imgdata = StringIO.StringIO()
        canvas.print_svg(imgdata)

        imgstr = imgdata.getvalue()

        context = super(TestView, self).get_context_data(**kwargs)
        context['svgtext'] = imgstr
        context['htmltable'] = frame[:5].to_html()

        return context

我最感兴趣的分析代码是get_context_data

当我加载页面时,实际上会显示调试工具栏。并显示分析面板。但我看到的只是:

{method 'disable' of '_lsprof.Profiler' objects}

这是页面首次加载时的屏幕截图:

这是它在分析页面上的外观:

它似乎根本没有做任何“线路分析”!我期望在基于类的视图中看到每一行的定时结果。特别是对于get_context_data 函数中的每一行。这是怎么回事?非常感谢任何帮助。


4/2 编辑

作为一个测试,我写了一个虚拟视图,使用基于类的视图。这似乎工作得很好。这是新的非基于类的视图:

def testview2(request):
    df = pd.DataFrame({'a': np.random.randn(10), 'b': np.random.randn(10)})
    htmltable = df.to_html()
    context = {}
    context['htmltable'] = htmltable

    return render(request, 'XXXX/test2.html', context)

这会在分析窗格中产生以下结果:

所以这似乎工作正常。关于debug-toolbar-line-profiler 如何与基于类的视图一起工作,我是否遗漏了一些微妙之处?在文档中,它建议它将分析类上不以下划线开头的任何方法。不对吗?

【问题讨论】:

  • 您的工作环境如何? windows、Linux/UNIX 还是 mac?
  • 部署在树莓派上
  • 如果有任何其他有用的信息,请告诉我。
  • 这只是一个猜测,但是对一个名为 Profiler 的对象的 disable 调用肯定看起来像是出了问题,因为探查器试图附加到代码,所以它在代码之前禁用了自己跑了,这就是您在个人资料中看到的全部内容。如果有日志可以检查更多信息可能会发送到哪里,请检查!
  • 在这种情况下进行分析有点新。关于这样的日志可能在哪里的任何想法?

标签: python django profiling raspberry-pi django-debug-toolbar


【解决方案1】:

由于您将其托管在某个芯片上,我强烈建议您使服务器端尽可能简单,并将复杂的逻辑处理移至客户端。

是的,相信 JS 可以和 python 一样多。它不会在您的服务器上。所有这些图形绘图,甚至模板渲染,您都应该将其移至客户端。这肯定会消除芯片类设备的页面服务时间。

至于调试,不如在真机上调试,然后移到 Ras-Pi 上。您可以添加一些简单的日志记录逻辑来对要检查的部分进行基准测试。

【讨论】:

  • 非常感谢您的回复。您关于将处理移至客户端以提高性能的说明是合理的。但这并不是真的要提高性能……而是要让基准测试工具“像宣传的那样”工作。关于分析器为什么不工作的任何想法?
【解决方案2】:

当我用@csrf_exempt 装饰我的视图时,我注意到了这种情况;一旦删除探查器工作正常。

不知道为什么会导致这个问题,但它为我解决了。

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 2021-07-15
    • 2022-08-13
    • 2022-06-28
    • 2022-10-20
    • 2015-05-13
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多