#python #django #highcharts
#python #django #highcharts
Вопрос:
ИЗБЕГАЙТЕ EVAL
На мой вопрос был дан ответ, и в итоге я использовал 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:
Вы могли бы вернуть JS-код в Django в виде строки, а затем вы можете выполнить 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>
Комментарии:
1. Как бы я добавил
eval()
к этой конкретной строке / значению в json? Как мне превратить это'color': 'Highcharts.getOptions().colors[0]'
в это?'color': eval('Highcharts.getOptions().colors[0]')
2. Вы могли бы легко получить доступ к дочернему элементу, используя что-то вроде этого:
data["style"]["color"]
— Я также обновил свой ответ, чтобы показать вам пример3. Спасибо, я изменил значение ключа с помощью
data['title']['style']['color'] = eval(data['title']['style']['color'])
, я постараюсь не оценивать ничего, связанного с пользовательским вводом.