Skipole WSGI generator.
Ensure your server has gnuplot installed.
Create a directory, and move to it, then create a skipole project "myproj", note the trailing space dot, for current directory.
python -m skilift myproj .
which creates the file myproj.py in your current directory.
Edit the start of your myproj.py file to include the import:
import subprocess
Run the project and use skiadmin to create a SubmitIterator responder, with a name such as 'chart.svg', and set with a submit_list string 'gnuplot'. Calling this from the browser will call your submit_data function which should return a binary iterator.
So a submit_data function such as this will do the job:
def submit_data(skicall):
"""This function is called by Responders"""
if skicall.submit_list[0] == 'gnuplot':
result = linechart((0, 1), (1, 2), (2, 3))
pd = PageData()
pd.mimetype = 'image/svg+xml'
skicall.update(pd)
return [result]
def linechart(*dataset):
"Create an SVG line chart, return svg code as a bytes string"
# data to plot as a string
datastring = "\n".join(f"{x} {y}" for x,y in dataset)
# commands to plot the points
commands = ['set title "line.svg"',
'set key off',
'plot "-" with lines'
]
return svgplot(commands, datastring)
def svgplot(commands, datastring):
"Call gnuplot with commands, and datastring returns svg bytes"
commandstring = "set terminal svg;" + ";".join(commands)
args = ["gnuplot", "-e", commandstring]
result = subprocess.check_output(args, input=datastring.encode("utf-8"), timeout=2)
return result
When chart.svg is called, this submit_data function returns the svg code and the image is served to the client.