Python Flask - Загрузка, обработка и отправка файлов (csv, xlsx, pdf и word) - Лучшие практики - PullRequest
0 голосов
/ 17 июня 2020

Мне было интересно, может ли кто-нибудь посоветовать мне, какие передовые практики будут в следующей ситуации: я пишу приложение flask и хочу, чтобы пользователь присылал мне файлы раз в две недели или ежемесячно , где файлы могут быть в формате CSV, XLSX, PDF или Word. Эти файлы содержат конфиденциальные данные клиента c, поэтому безопасность этих файлов имеет первостепенное значение.

Я понимаю, что это довольно длинный вопрос, поэтому заранее прошу прощения за него. Ниже приведены лишь некоторые из онлайн-ресурсов, которые я использовал, чтобы ответить на свои вопросы. Некоторые из них были полезными, другие я нашел чрезвычайно сложными. 1. https://viveksb007.github.io/2018/04/uploading-processing-downloading-files-in-flask 2. Написание CSV из Flask framework 3. Создайте и загрузите CSV-файл из Flask view 4. Загрузите файл CSV, используя Python Flask, и обработайте его 5. Прочтите данные файла, не сохраняя их в Flask

После прохождения нескольких ответов о переполнении стека, Я пришел к выводу, что существует несколько способов сделать это: A. Один из них - сохранить исходный файл от пользователя в папке в том же каталоге, где находится мой файл application.py. Таким образом, как и при использовании следующего синтаксиса

UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'

Как только файл окажется в этой папке 'uploads', я смогу получить к нему доступ и обработать его, используя следующий синтаксис, если он позволяет сказать файл csv.

with open('UPLOAD_FOLDER/filename.csv') as csv_file:
    file = csv.reader(csv_file)

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

return send_from_directory('UPLOAD_FOLDER/processed_filename.csv', as_attachment=True)

Кто-нибудь, пожалуйста, объясните мне следующее:

i) этот процесс кажется работать, когда я размещаю приложение локально. Однако что произойдет, когда я разверну это веб-приложение? Что возвращается UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/uploads/'? По сути, я пытаюсь понять, каким будет абсолютный путь приложения? Приведет ли это к тому, что пользователь загрузит файл где-нибудь на сервере компании, которую я использовал для развертывания своего веб-приложения?

ii) Учитывая, что я работаю с конфиденциальной информацией о клиенте, каковы основные риски безопасности, связанные с этим конкретным методом?

iii) Если я предполагаю, что загруженные и обработанные файлы будут сохранены на сервере компании, которую я использую для развертывания своего веб-приложения, означает ли это, что это будет очень дорогой метод выполнения этой задачи? То есть я бы занимал много места на сервере просто для сохранения файлов, загруженных и впоследствии обработанных моим приложением?

B. Другой метод, с которым я столкнулся, заключался в сохранении содержимого загруженного файла в потоке. Я не совсем уверен, какие потоки находятся в python (хотя я потратил много времени на чтение документации). Для этого метода я буду создавать форму html с enctype="multipart/form-data", чтобы она могла принимать файлы. После того, как пользователь загрузит файл, я сохраню содержимое файла в потоке, используя следующий синтаксис

file = request.files["file"]
stream = codecs.iterdecode(file.stream, 'utf-8')

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

with open(stream, "w") as csv_file:
    file = csv.reader(csv_file)

Я в конечном итоге отправлю клиенту обработанный файл пользователю, используя следующий синтаксис: Я предполагаю, что я уже создал обработанный файл, и он называется "processingfilename.csv"

return send_file(filename="resultssss.csv", as_attachment=True)

Кто-нибудь может объяснить:

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

ii) Я читал онлайн в одном из ответов stackoverflow, что поток имеет ограничение на то, сколько он может читать, и если размер файла слишком велик, этот метод может не работать. Я считаю, что предел, указанный в этом ответе, составлял 16 КБ или около того. Мой клиент обязательно будет отправлять файлы, размер которых превышает этот размер.

...