在 django 视图中禁用对新遗物的监控

Posted

技术标签:

【中文标题】在 django 视图中禁用对新遗物的监控【英文标题】:disable monitoring for new relic in django views 【发布时间】:2015-09-27 13:43:52 【问题描述】:

我正在使用 Django 框架(版本 1.5.1),其中包含近 25 个内部应用程序,每个应用程序平均有 7 到 15 个不同的视图,相当多。

所以要监控RPM、查询时间等。 .并优化代码响应我正在使用New Relic(免费)服务,它非常有用,但是可以监控模板/请求的响应时间 它在加载页面之前对页面进行 javascript 注入

通常这不是坏事,除非你的发送电子邮件每天都有一个html呈现页面,他们是人间地狱,因为js注入了html文学吃掉/破坏html。

如果您手动发送这些邮件,那么也许您可以在发送之前验证内容,但在我的情况下,这是一个 crontab 任务,所以这对我来说不是一个解决方案。

在官方文档中,disable_browser_autorum 函数正是我所需要的,但是(再次)您可以在 WSGI 服务器中使用 newrelic.disable_browser_autorum 变量,但我正在使用 supervisord 运行 gunicorn 服务器,所以这并不好。

但您还必须在框架视图中插入 newrelic.agent.disable_browser_autorum(flag=True) 变量并与 html 引号一起使用。

% load staticfiles newrelic_tags %
<!DOCTYPE html>
<html lang=" LANGUAGE_CODE ">
<head>
    <meta charset="utf-8" />
    % newrelic_browser_timing_header %
<body>
  . 
  .
  .

   % newrelic_browser_timing_footer %
</body>
</html>

但是没有关于如何做到这一点的信息,我也自己做了测试,试图弄清楚如何工作。

我不是 python 或 django 的大开发人员,但根据经验,它必须是类似的东西

class EmailView(DetailView):
    template_name = 'email/daily-newsletter.html'
    model = News

    def get_queryset(self):
        return News.objects.filter(date=datetime.date.today())

    def get_context_data(self, **kwargs):
        context = super(EmailView, self).get_context_data(**kwargs)
        context['related_news'] = NewsRelated.objects.get(related=self.id)

        >> HERE DO SOMETHING LIKE self.request.something =newrelic.agent.disable_browser_autorum(flag=True)<<
        return context

有人可以帮我解决这个问题吗?欢迎任何建议。

PS:我已经在 New Relic 官方社区posted a question,但到目前为止还没有运气。

【问题讨论】:

我很困惑为什么你认为 gunicorn 不是 wsgi 服务器。 另外,这个 JS 会被添加到电子邮件中似乎 非常 奇怪。该代码通过中间件添加到响应。我无法弄清楚你的电子邮件是如何成为回复的。 最后我不明白为什么你不关注very clear instructions 只是把newrelic.agent.disable_browser_autorum() 放到你的视图中。 为什么还要手动将 newrelic 标签添加到模板中?在将 Django 作为适当的 WSGI 应用程序运行时,New Relic 代理会自动为您执行此操作。因此,只需尝试在模板中使用标签。 @GrahamDumpleton 我使用模板标签将监控限制在最重要的页面上,这也是最常用的页面。这是我从官方文档中了解到的。 【参考方案1】:

感谢我的同事和@Daniel Roseman 的帮助,我的问题得到了解决,这是一个简单的解决方案:

import newrelic.agent
. . .

class EmailView(DetailView):
    template_name = 'email/daily-newsletter.html'
    model = News

    def get_queryset(self):
        return News.objects.filter(date=datetime.date.today())

    def get_context_data(self, **kwargs):
        context = super(EmailView, self).get_context_data(**kwargs)
        context['related_news'] = NewsRelated.objects.get(related=self.id)

        newrelic.agent.disable_browser_autorum(flag=True)
        return context

但后来我的同事评论说,newrelic 它是一个“环境变量”,所以只要把它放在那里就可以了。

就是这样。

【讨论】:

newrelic 代理仅在您添加 flag=True 后才会禁用 javascript 注入。

以上是关于在 django 视图中禁用对新遗物的监控的主要内容,如果未能解决你的问题,请参考以下文章

为不总是有响应的视图禁用 Django CSRF

在Django 1.11更改视图中禁用原子事务

在 django-page-CMS 中创建的视图会禁用所有 CSS?包含代码,请修复

在 api 视图方法上禁用 CSRF(django rest 框架)

Django 禁用斜杠

Django 是两次初始化视图