Django-debug-toolbar-line-profiler只显示一行输出,没有内容

8on*_*ne6 10 python django profiling django-debug-toolbar raspberry-pi

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

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

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

  1. 点击DB获取最后300次温度记录
  2. 把它们放进熊猫里 DataFrame
  3. 使用Matplotlib生成最近温度历史的一个很好的SVG图
  4. 填写一个显示SVG的简单模板,以及最近温度读数的小型HTML表格.

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

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

我已按照我理解的最佳文档配置它们.特别是,我已经设定:

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',
)
Run Code Online (Sandbox Code Playgroud)

另外,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
Run Code Online (Sandbox Code Playgroud)

我最感兴趣的代码是get_context_data.

当我加载页面时,调试工具栏确实显示出来.并显示了配置文件面板.但我所看到的只是:

{method 'disable' of '_lsprof.Profiler' objects}
Run Code Online (Sandbox Code Playgroud)

这是首次加载时页面的屏幕截图: 在此输入图像描述

以下是它在分析页面上的外观: 在此输入图像描述

它似乎根本不做任何"线条剖析"!我希望在基于类的视图中看到每行的定时结果.特别是,对于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)
Run Code Online (Sandbox Code Playgroud)

这会在分析窗格中生成以下结果: 在此输入图像描述

所以这似乎工作正常.我是否遗漏了一些关于如何debug-toolbar-line-profiler使用基于类的视图的细微之处?在文档中,它表明它将分析类中不以下划线开头的任何方法.这是不正确的?

zin*_*ing 0

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

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

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

  • 非常感谢您的回复。您关于将处理移至客户端以提高性能的说明是合理的。但这实际上并不是为了提高性能……而是为了让基准测试工具“按照广告宣传的那样”工作。关于探查器不工作的原因有什么想法吗? (2认同)