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

时间:2014-03-30 19:48:29

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

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

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

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

  1. 点击DB获取最后300次温度记录
  2. 将这些放入熊猫DataFrame
  3. 使用Matplotlib生成最近温度历史记录的漂亮SVG图
  4. 填写一个显示SVG的简单模板,以及最近温度读数的小型HTML表格。
  5. 渲染此视图需要约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}
    

    这是首次加载时页面的屏幕截图: enter image description here

    以及它在分析页面上的显示方式: enter image description here

    它似乎并没有做任何"线条分析"一点都没有!我希望在基于类的视图中看到每行的定时结果。特别是,对于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)
    

    这会在分析窗格中产生以下结果: enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

当我用@csrf_exempt装饰我的观点时,我注意到了这种情况;一旦删除,分析器工作正常。

不确定为什么会导致问题,但是我已经解决了这个问题。