在Django模板中切换javascript调试

在Django模板中切换javascript调试,javascript,django,debugging,Javascript,Django,Debugging,我正在Django项目的javascript端工作,我的javascript函数将一些文本输出到控制台,以便我可以更轻松地调试。我的javascript文件如下所示: (function(nameSpace, $, undefined ) { var debug = true; nameSpace.foo = function() { if (debug) { console.log('foo was there') }

我正在Django项目的javascript端工作,我的javascript函数将一些文本输出到控制台,以便我可以更轻松地调试。我的javascript文件如下所示:

(function(nameSpace, $, undefined ) {
    var debug = true;

    nameSpace.foo = function() {
        if (debug) {
            console.log('foo was there')
        }
    };

}(window.nameSpace = window.nameSpace || {}, jQuery ));
我认为最好在生产环境中关闭此输出,但我不想更改每个javascript文件。所以我想我应该创建一个
context\u处理器
,将
settings.DEBUG的值传递给我的基本模板

现在我的base.html中有:

<html>
  <head>
    ...
    <script> var window.debug = {{ DEBUG }}; </script>
  </head>
  ...
</html>

...
var window.debug={{debug};
...
我的javascript文件中有
var debug=window.debug
,而不是硬编码的布尔值

回想起来,我想知道这是否安全。我认为有人可以很容易地处理
window.debug
变量,只要控制台输出不泄漏安全信息,例如
csrf
令牌,就可以了。我不是安全专家,但我觉得这里有点滑


我现在的想法安全吗?如果不是的话,我怎样才能在整个项目中更安全地切换javascript调试呢?

您当前的想法是安全的,尽管有点笨拙,也许有点草率。将CSRF令牌或其他令牌泄漏到控制台本身并不是问题,因为以编程方式访问控制台历史记录的唯一方法是在执行
console.log
和family之前保存它(或者在页面上已经收到恶意JS,此时您仍然会受到攻击)。浏览器无法执行从控制台复制的操作,否则它将成为一个巨大的攻击向量(总的来说,我们的代码是草率的)。 客户端调试变量的另一种可能更干净的选择是完全选择console.*函数。考虑:

{% if not DEBUG %}
<script>
    window.console = (function(){
        var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(s){};
        return c;
    })();
</script>
{% endif %}
{%if not DEBUG%}
window.console=(函数(){
var c={};c.log=c.warn=c.debug=c.info=c.error=c.time=c.dir=c.profile=c.clear=c.exception=c.trace=c.assert=function{};
返回c;
})();
{%endif%}
换句话说,只需将
console.log()
调用直接留在那里。同时,在调试案例中,完全省略上述内容,瞧,调试信息是可用的


请注意,这同样是草率的,因为“正确操作”意味着在非调试情况下根本不需要那些插装调用,而只是消除了在所有调用站点上额外使用JS的需要。同时,JIT将智能地完全删除所有这些函数调用(因为它们现在是noop),您可以获得轻微的启动性能提升。

谢谢您的回答。我欣赏内容和风格。