首页 > 解决方案 > 在 Flask 应用程序中运行时函数不会返回元组/列表

问题描述

背景

我正在开发一个简单的 Flask 应用程序。我有一个应该返回一个元组的函数:

import numpy as np
import pandas as pd

def extract_data(path: str) -> Tuple[np.ndarray, int, pd.DataFrame]:
    csv = pd.read_csv(path):
    data = csv["data"].to_numpy()
    data[np.isnan(data)] = 0
    data = np.expand_dims(data, axis=0)
    bounds = len(csv["bounds"]) - 1
    data = data[data != 0]
    return data, bounds, csv

问题和尝试

如果我在 Flask 之外运行它,它可以正常工作(返回 tuple (data, bounds, csv))。但是,当我在 Flask 中运行它时,它给了我错误 ValueError: too many values to unpack (expected 3)。当我在 Flask 中调试并打印函数返回的值时,它只打印以下值data

>>> print(extract_data(os.path.join(app.instance_path, 'uploads', filename)))
[0.0476  0.07544 0.27416 0.04569 0.01261]

但是,如果我运行extract_dataFlask 调试器中的步骤,它也可以正常工作。我不认为它extract_data本身有问题。我试过用逗号包装元组,将元组定义为变量并返回变量,并删除类型提示。我可以在 Flask 之外使用具有相同数据的此函数并返回预期的元组。文件上传似乎工作得很好,csv看起来像预期的那样。

编辑:我也试过返回一个列表并得到同样的错误。我还尝试将列表分配给一个变量并返回该变量并得到相同的错误。

相关信息

data是一个 numpy 数组:

[0.0476 0.07544 0.27416 0.04569 0.01261]

这里是csv

   bounds     data
0      84  0.04760
1    2483  0.07544
2    4540  0.27416
3   13822  0.04569
4   20075  0.01261
5   23400      NaN

并且n_intervals是一个 int (5)。

这是 Flask 应用程序的相关部分:

from flask import Flask, render_template
from werkzeug.utils import secure_filename
from app import app
from app.forms import MyForm

@app.route('/upload', methods = ['GET', 'POST'])
def upload():
    form = MyForm()
    if form.validate_on_submit():
        f = form.csv.data
        filename = secure_filename(f.filename)
        f.save(os.path.join(app.instance_path, 'uploads', filename))
        data, bounds, csv = extract_data(os.path.join(app.instance_path, 'uploads', filename))
        return render_template('result.html')
    return render_template('upload.html', form=form)

MyForm只是一个继承自FlaskForm文件flask_wtf上传的类。

我对此感到很困惑,所以任何帮助将不胜感激。

标签: pythonflask

解决方案


似乎 Flask 要求您在sys.path.insert.

例如:

sys.path.insert(0, "/full/path/goes/here")

并不是

sys.path.insert(0, "~/path/goes/here")

或者

sys.path.insert(0, "../path/goes/here")

指定绝对路径时,该函数可以正确运行。


推荐阅读