2017-01-23 7 views
0

Я использую pygal, чтобы нарисовать некоторые данные в веб-приложении, над которым я работаю, и подумал, что было бы неплохо экстернализировать конфигурацию диаграммы.Настроить диаграмму пигала с внешним файлом conf?

Так что я написал раздел в моем конфе файл, который реплицируется мой в коде конф:

[ChartOptions] 
x_label_rotation: -75 
x_labels_major_every: 5 
show_minor_x_labels: False 
range: (30,100) 
stroke_style: {'width':8} 
title: Chart Title 

и обнаружил, что прохождение раздела ChartOptions к (например) pygal.Config() привело к

File "/usr/local/lib/python2.7/dist-packages/pygal/util.py", line 370, in mergextend 
    if list1 is None or _ellipsis not in list1: 

Как это сделать?

ответ

0

Я довольно новичок в Python, так что, возможно, это все лишнее, хорошо известно или существует лучший способ. У меня была куча неприятностей и я ничего не мог найти, так что мы здесь.

Первое, что я разработал, это то, что pygal.util.mergextend() не любит находить строки, где он ожидает других типов данных. Значения в OrderedDict, возвращаемые из разделов ConfigParser.read() ._ [your_section_here], являются строками, поэтому их нужно преобразовать в их правильный тип.

Введите: ast.literal_eval().

Это похоже на то, что это сработает, но продолжало поднимать значение ValueError («неправильная строка») на значение __name__, которое было str, для каждого типа (опции ['__name__']). Ну, а теперь что?

Мне действительно не нужно значение __name__, поэтому я использовал pop(), чтобы удалить его из словаря, который оставил значение title. Я хотел использовать title, знал, что может быть строкой на один пигаль и иметь контроль над ее стоимостью, так что же можно сделать?

Документы для ast.literal_eval() настаивают на том, что он позволяет использовать строки, поэтому добавление котировок значения title в файле conf показалось «разумным» и сработало.

Собираем все вместе, и добавление колбы в смесь, мы получим:

конф файл:

... 
[ChartOptions] 
x_label_rotation: -75 
x_labels_major_every: 5 
show_minor_x_labels: False 
range: (30,100) 
stroke_style: {'width':8} 
# note added quotes below 
title: "Chart Title" 
... 

app.py:

import ConfigParser 
import ast 
import pygal 
from pygal import Config 
from flask import Flask, render_template 
... 
config = ConfigParser.ConfigParser() 
config.read('my.conf') 
chart_options = config._sections[CHART_SECTION] 
chart_options.pop('__name__') 
for key in chart_options.keys(): 
    chart_options[key] = ast.literal_eval(chart_options[key]) 

@app.route('/route') 
def a_route(): 
    global chart_options # haven't made this into a class yet... 
    chart_config = Config(**chart_options) 

    chart = pygal.Line(chart_config) 
    ... 
    # add data and finalize chart setup 
    ... 
    return render_template('route.html', chart=chart.render()) 
... 

 Смежные вопросы

  • Нет связанных вопросов^_^