создание опций highcarts в views.py

#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']) , я постараюсь не оценивать ничего, связанного с пользовательским вводом.