使用外部conf文件配置pygal图表?

时间:2017-01-23 20:30:20

标签: python pygal

我正在使用pygal来绘制我正在处理的Web应用程序中的一些数据,并认为外部化图表的配置是个好主意。

所以我在我的conf文件中写了一个部分,复制了我的代码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:

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我在Python上相当新,所以也许这些都是不必要的,众所周知或存在更好的方法。我遇到了一些麻烦,找不到任何东西,所以我们来了。

我解决的第一件事是pygal.util.mergextend()不喜欢找到期望其他数据类型的字符串。从ConfigParser.read()._ sections [your_section_here]返回的OrderedDict中的值都是字符串,因此需要将它们转换为正确的类型。

输入:ast.literal_eval()。

这似乎可行,但在__name__值上提出了一个ValueError('格式错误的字符串'),这是一个str,每种类型(options ['__name__'])。那么,现在呢?

我并不真正需要__name__值,因此我使用pop()将其从字典中删除,该字典处理title值。我想使用title,知道每个pygal可以是一个字符串并控制它的值,那么可以做些什么呢?

ast.literal_eval()的文档坚持认为它允许使用字符串,因此在conf文件中添加title值的引号似乎“合理”,并且有效。

把所有这些放在一起,然后在混合物中加入烧瓶,我们得到:

conf file:

...
[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())
...