在views.py中构建highcarts选项

时间:2019-04-23 13:01:57

标签: python django highcharts

避免评估

我的问题已得到回答,我最终使用了eval,但是在搜索了eval可以做什么之后,我最终没有使用它,而是使用了以下替代方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval


在我的应用程序中,我正在后端构建整个图表选项,并将其作为json响应返回

def get_chart_data(request):
    chart = {
        'title': {
            'text': ''
        },
        'xAxis': {
            'categories': [],
            'title': {
                'text': ''
            },
            'type': 'category',
            'crosshair': True
        },
        'yAxis': [{
            'allowDecimals': False,
            'min': 0,
            'title': {
                'text': ''
            }
        }, {
            'allowDecimals': False,
            'min': 0,
            'title': {
                'text': ''
            },
            'opposite': True
        }],
        'series': [{
            'type': 'column',
            'yAxis': 1,
            'name': '',
            'data': []
        }, {
            'type': 'line',
            'name': '',
            'data': []
        }, {
            'type': 'line',
            'name': '',
            'data': []
        }]
    }
    return JsonResponse(chart)

然后使用ajax获取数据并使用响应作为数据

Highcharts.chart('dashboard1', data);

到目前为止,我还可以,但是如果我想将highcharts函数用作选项的一部分,例如使用Highcharts.getOptions().colors[0]设置文本的颜色,

'title': {
        'text': 'Rainfall',
        'style': {
            'color': Highcharts.getOptions().colors[0]
        }
    },

如果我在views.py中构建选项时不加引号,它将被视为python代码并导致错误,但是,如果我在其上加上引号,则它将被视为字符串javascript,将无法正常工作。

这可能吗?还是我应该在javascript中建立选项,而只将数据部分放在后端而不是整个页面。

1 个答案:

答案 0 :(得分:1)

您可以将Django中的JS代码作为字符串返回,然后可以在其上运行eval(),但是执行类似的代码可能会引发XSS攻击,特别是如果信息是用户可提交的。

否则,您最好的选择是在JS端创建样式,并处理传入的数据。

document.querySelector('a').addEventListener('click', function (e) {
  e.preventDefault();
  
  var complexJson = {"parent": {"child": "alert('Here is a nested alert!')"}}
  var alertString = "alert('Here is a simple alert!')";
  
  eval(complexJson["parent"]["child"])
  eval(alertString)
})
<a href="#">Click me!</a>