Загрузить файл с сервера, используя send_from_directory и имя файла - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь понять, как передать загруженное имя файла следующему @ app.route в flask, чтобы получить файл, сохраненный на сервере.

Мне удалось создать форму для загрузки файла на сервер следующим образом, и я смог отрисовать данные файла и имя файла в исходном представлении.

@app.route('/file_upload', methods=['GET', 'POST'])
def upload():

form = UploadForm()

if form.validate_on_submit():
    f=form.file.data
    filename = secure_filename(f.filename)
    file_path = os.path.join(UPLOAD_FOLDER, filename)
    f.save(file_path)
    Input_data_dataframe = pd.read_excel(f)
    return render_template('Set_parameters.html',filename=filename,tables=[Input_data_dataframe.to_html(classes=["table table-dark table-hover"], header="true", index=False,)])

return render_template('file_upload.html',form=form)

Файл успешно сохраняется в требуемом месте назначения сервера, и имя файла также отображается в следующем представлении, например:

Filename is transferred to view

Теперь я хочу, чтобы этот файл быть извлечены из местоположения сервера для дальнейшей обработки. Я понимаю, что могу использовать функцию send_from_directory () для получения файла, однако я не уверен, как реализовать его с правильным именем файла из предыдущего @ app.route ('/ file_upload')

@app.route('/Set_Parameters/', methods=['GET', 'POST'])
def processing(filename):

retrievedfile= send_from_directory(app.config['UPLOAD_FOLDER'],filename=filename, as_attachment=False)
Input_data_dataframe = pd.read_excel(retrievedfile) #converts uploaded file to a dataframe astype(int)

if request.method == 'POST':

    Input_value1= request.form.get['Input_value1'] #get html form data value
    Input_value= request.form.get['Input_value2'] #get html form data value

    return render_template('Results.html',Input_value1=Input_value1, Input_value2=Input_value2, tables=[Input_data_dataframe.to_html(classes=["table table-dark table-hover"], header="true", index=False,)])
return render_template('Set_parameters.html')

В настоящее время, если бы я работал как есть, я получил бы эту ошибку Ошибка типа: processing () отсутствует 1 обязательный позиционный аргумент: 'имя файла' , насколько я понимаю, я не передал имя файла функции. Я просто не уверен, как это сделать без жесткого кодирования имени файла в коде, а затем использовать этот же файл для дальнейшей обработки.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 26 апреля 2020

Ваша функция processing ожидает параметр filename от URL. Вы можете увидеть, как это должно быть сделано здесь: https://flask.palletsprojects.com/en/1.1.x/quickstart/#variable -rules .

Путь к этому виду должен быть: /Set_Parameters/<filename>/. Это означает, что action атрибут from должен быть, например: action="/Set_Parameters/This_is_the_file.xlsx". Если вы визуализируете эту форму в flask, используя flask шаблоны, это будет легко, если у вас есть имя файла в контексте визуализации:

<form action="/Set_Parameters/{{ filename }}">
...
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...