Создать PDF-график в Flask - PullRequest
       0

Создать PDF-график в Flask

0 голосов
/ 20 апреля 2020

Я хотел бы создать небольшое приложение в Flask, которое: 1. Позволяет пользователю загружать данные, в csv 2. Делает вещи в данные (в этом примере ничего не будет сделано) 3. Результаты печати 4. Разрешите пользователю загружать график результатов в формате pdf.

Код:

app.py

from flask import Flask, Response, request, render_template
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.backends.backend_svg import FigureCanvasSVG

import io
import csv
import pandas as pd

app = Flask(__name__)

@app.route("/", methods=['POST', 'GET'])
def index():
    return render_template("index.html")


@app.route('/transform', methods=["GET", "POST"])
def transform_view():
    """ process data and render plot on the fly.
    """
    # GET input csv 
    f = request.files['input_file']
    if not f:
        return "Main input file not found!"

    # Read uploaded data as a Stream into a dataframe. 
    stream = io.StringIO(f.stream.read().decode("UTF8"), newline=None)
    csv_input = csv.reader(stream)
    contents = []
    for row in csv_input:
        contents.append(row)
    d0 = pd.DataFrame(data=contents[1:], columns=contents[0])

    # Change to numeric columns
    d0[["col1", "col2"]] = d0[["col1", "col2"]].apply(pd.to_numeric)

    # Plot
    fig, ax = plt.subplots()
    bplot = ax.boxplot([d0["col1"], d0["col2"]])

    # Print out plot as pdf?
    #output = io.BytesIO()
    return render_template("index.html")


if __name__ == "__main__":
    app.run(debug=True)

index. html

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
    <form action="/transform" method="post" enctype="multipart/form-data">
      <h3>Upload input file (csv)</h3>
        <input type="file" name="input_file" id="input_file">
        <br>
        <input type="submit" value="Process & Download" name="submit">
    </form>
</body>
</html>

sample_input.csv

col1,col2
1,5
2,6
3,7
9,10
6,11

Так что я могу сгенерировать pdf с помощью matplotlib, но я не уверен, как вернуть это как pdf пользователю ( последний шаг). Я не замужем за matplotlib; если есть другие библиотеки для построения графиков, которые могут возвращать графики в формате pdf, я также открыт для этого.

1 Ответ

0 голосов
/ 20 апреля 2020

Не проверено (у меня не установлено flask на этой рабочей станции), но вы можете сохранить рисунок в формате PDF, указав правильное расширение

fig.savefig('/tmp/some_unique_string.pdf')

, а затем подать файл с send_from_directory

from flask import send_from_directory
send_from_directory('/tmp', 'some_unique_string.pdf')

Несколько незапрошенных советов:

  1. Вы можете прочитать CSV с pandas.read_csv. Это работает с путем к файлу или потоком ввода-вывода и автоматически меняет столбцы с цифрами c на соответствующий тип чисел c.

  2. Если вы хотите переключиться на другой бэкэнд, вам необходимо сделать это перед импортом pyplot.

В частности:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...