Flask-Uploads не будет разрешать разрешать только файлы .csv - PullRequest
1 голос
/ 17 марта 2019

Я использую Flask, Flask-Bootstrap и Flask-Uploads с Python 3.7.1 для создания очень простого приложения, которое принимает файл csv, содержащий необработанные данные.

Страница «Загрузка» должна разрешать толькоCSV-файлы для загрузки.Я попытался реализовать ответ, данный на в этом посте.

Попытки загрузки с .csv работают как положено, но другие типы файлов (например, .jpg) по-прежнему принимаются.Я что-то упускаю здесь очевидное?

'details.html' сейчас просто отображает имя файла на странице.

Код Python:

import os  
from flask import Flask, render_template, url_for, request
from flask_bootstrap import Bootstrap
from flask_uploads import UploadSet, configure_uploads

app = Flask(__name__)
Bootstrap(app)

# Upload files configuration
csv_file = UploadSet('files', ('csv'))
app.config['UPLOADED_FILES_DEST'] = 'static/uploadstorage'
configure_uploads(app, csv_file)

# index
@app.route('/')
def index():
    return render_template('index.html')

# if csv file, show the data in a table. if not csv file, reload index page
@app.route('/datauploads', methods=['GET', 'POST'])
def datauploads():

    if request.method == 'POST' and 'csv_data' in request.files:

        file = request.files['csv_data']
        filename = file.filename
        file.save(os.path.join('static/uploadstorage', filename))
        return render_template('details.html', filename=filename)

    return render_template('index.html')

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

1 Ответ

3 голосов
/ 17 марта 2019

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

Вам также нужно передать последовательность расширений, в настоящее время вы передаете строку, добавляя запятую ксделайте его кортежем:

csv_file = UploadSet('files', ('csv',))

и, по вашему мнению, используйте:

@app.route('/datauploads', methods=['GET', 'POST'])
def datauploads():
    if request.method == 'POST' and 'csv_data' in request.files:
        filename = csv_file.save(request.files['csv_data'])
        return render_template('details.html', filename=filename)

    return render_template('index.html')

Однако вы, вероятно, захотите перехватить исключение UploadNotAllowed, так как в противном случае вы получите 500ошибка:

from flask_uploads import UploadSet, configure_uploads, UploadNotAllowed
from flask import flash

@app.route('/datauploads', methods=['GET', 'POST'])
def datauploads():
    if request.method == 'POST' and 'csv_data' in request.files:
        try:
            filename = csv_file.save(request.files['csv_data'])
            return render_template('details.html', filename=filename)
        except UploadNotAllowed:
            flash('Only CSV files can be uploaded, please correct', 'error')

    return render_template('index.html')

Я использовал мигающее сообщение (которое Flask-Bootstrap может поддерживать напрямую ), но ваш index.html также может быть изменен, чтобы принять ошибкусообщение.

...