Форма фляги не позволяет загружать файлы TSV - PullRequest
0 голосов
/ 15 июня 2019

У меня есть следующее приложение фляги, где я хочу иметь возможность загрузить файл TXT или TSV в форму.Проблема в том, что когда я пытаюсь загрузить файл TXT, он работает, но когда я пытаюсь загрузить файл TSV, я получаю следующую ошибку:

  File "/Users/cdastmalchi/Desktop/author_script/main.py", line 89, in process_file
    if not places_exist(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
  File "/Users/cdastmalchi/Desktop/author_script/main.py", line 27, in places_exist
    infile = open(filename, 'rU')
IOError: [Errno 2] No such file or directory: './Authors_Template.tsv'

Authors_Template.tsv - это файл шаблона, который получаетзагружается из формы и переходит в Downloads, а затем я хочу, чтобы пользователи могли редактировать этот шаблон, а затем повторно загрузить его.Когда я делаю шаблон Authors_Template.txt, а затем загружаю и повторно загружаю его, он работает.Как я могу решить эту проблему?Я даже пытался сузить список ALLOWED_EXTENSIONS до TSV, и я все еще получаю ту же проблему.

app.py

from werkzeug.utils import secure_filename
import flask, string, random
import json
import subprocess
import os
import re
import time


UPLOAD_FOLDER = '.'
ALLOWED_EXTENSIONS = set(['txt','tsv'])

app = flask.Flask(__name__)

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.secret_key = ''.join(random.choice(string.ascii_letters) for _ in range(20)) #needed to use flask.session



def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

def places_exist(filename):
    infile = open(filename, 'rU')

    placeDict = {}
    addresses_temp = []
    addresses = []
    places_temp =[]
    places = []
    places_exist = True

    for i in infile:
        item = i.rstrip("\n").split("\t")
        places_temp.append(item[0])
        addresses_temp.append(item[1])

    p_index = (places_temp.index('Place')) + 1
    a_index = (addresses_temp.index('Address')) + 1

    places = places_temp[p_index:]
    addresses = addresses_temp[a_index:]

    infile.close()

    infile = open(filename, 'rU')

    return places_exist

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

@app.route('/process_file', methods=['POST'])
def process_file():
  #here, you can run all the checks as before, but instead of flash, you can return jsonified results to read in the front-end
    if 'file' not in flask.request.files or not flask.request.files['file'].filename:
        return flask.jsonify({'result':'False', 'message':'no files selected'})
        return flask.redirect(url_for('home'))
    file = flask.request.files['file']
    filename = secure_filename(file.filename)
    if not allowed_file(file.filename):
        return flask.jsonify({'result':'False', 'message':'Must be TXT file!'})
        return flask.redirect(url_for('home'))
    if not places_exist(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
        return flask.jsonify({'result':'False', 'message':'There is an affiliation missing from your Place list. Please re-try.'})
        return flask.redirect(url_for('home'))
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    flask.session['filename'] = filename
    return flask.jsonify({'result':'True'})

ОБНОВЛЕНИЕ:

def process_file():
  #here, you can run all the checks as before, but instead of flash, you can return jsonified results to read in the front-end
    if 'file' not in flask.request.files or not flask.request.files['file'].filename:
        return flask.jsonify({'result':'False', 'message':'no files selected'})
        return flask.redirect(url_for('home'))
    file = flask.request.files['file']
    filename = secure_filename(file.filename)
    if not allowed_file(file.filename):
        return flask.jsonify({'result':'False', 'message':'Must be TXT file!'})
        return flask.redirect(url_for('home'))
    # Save the file in the temp folder
    file.save(os.path.join(app.config['TEMP_FOLDER'], filename))
    # Process the file 
    if not places_exist(os.path.join(app.config['TEMP_FOLDER'], filename)):
        return flask.jsonify({'result':'False', 'message':'There is an affiliation missing from your Place list. Please re-try.'})
        return flask.redirect(url_for('home'))
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    flask.session['filename'] = filename
    return flask.jsonify({'result':'True'})

1 Ответ

1 голос
/ 15 июня 2019

Вы пытаетесь прочитать файл перед его записью в вашем каталоге. Сначала необходимо сохранить файл в каталоге загрузки приложения, а затем прочитать его.

def process_file():
    # here, you can run all the checks as before, but instead of flash, you can return jsonified results to read in the front-end
    if 'file' not in flask.request.files or not flask.request.files['file'].filename:
        return flask.jsonify({'result':'False', 'message':'no files selected'})
        return flask.redirect(url_for('home'))
    file = flask.request.files['file']
    filename = secure_filename(file.filename)
    if not allowed_file(file.filename):
        return flask.jsonify({'result':'False', 'message':'Must be TXT file!'})
        return flask.redirect(url_for('home'))
    # Save the file in the correct Location
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
    # Process your file already saved
    if not places_exist(os.path.join(app.config['UPLOAD_FOLDER'], filename)):
        return flask.jsonify({'result':'False', 'message':'There is an affiliation missing from your Place list. Please re-try.'})
        return flask.redirect(url_for('home'))

    flask.session['filename'] = filename
    return flask.jsonify({'result':'True'})

РЕДАКТИРОВАТЬ: вы должны быть осторожны, если вам нужно проверить файл перед сохранением, если вы сохраните сразу, вы переопределите свой старый файл, хороший способ будет сохранить файл во временном местоположении, проверить этот файл и затем сохраните в последнем каталоге и, очевидно, удалите файл в папке tmp.

PS: Также у вас есть 2 возврата, если вам нужно ответить как HTML или JSON, вы должны проверить заголовки запроса.

...