避免评估
我的问题已得到回答,我最终使用了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中建立选项,而只将数据部分放在后端而不是整个页面。
答案 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>