Python Flask — загрузка, обработка и отправка файлов (csv, xlsx, pdf и word) — лучшие практики

Мне было интересно, может ли кто-нибудь подсказать мне, каковы наилучшие методы в следующей ситуации: я пишу фляжное приложение, и я хотел бы, чтобы пользователь отправлял мне файлы раз в две недели или ежемесячно, где файлы могут быть любой из csv, xlsx, pdf или word. Эти файлы содержат конфиденциальные данные клиента, поэтому безопасность этих файлов имеет первостепенное значение.

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

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

UPLOAD_FOLDER = os.path.dirname(os.path.abspath(__file__)) + '/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) Если я предполагаю, что загруженные и обработанные файлы будут сохранены на сервере компании, которую я использую для развертывания своего веб-приложения, означает ли это, что это будет очень дорогой метод выполнения этой задачи? То есть я бы занимал много места на сервере просто для того, чтобы сохранять загруженные и впоследствии обработанные моим приложением файлы?

Б. Другой метод, с которым я столкнулся, заключался в сохранении содержимого загруженного файла в поток. Я не совсем уверен, какие потоки есть в 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)

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

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

Может кто-нибудь объяснить:

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

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


person Bilal Junaidy    schedule 17.06.2020    source источник