РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
463 of 643 menu

Функция secure_filename

Функция secure_filename применяется для преобразования произвольной строки в безопасное имя файла. Первым параметром передаётся исходное имя файла. Функция удаляет опасные символы, отбрасывает пути и возвращает строку, которую можно безопасно использовать при сохранении файла на сервере.

Функция полезна при загрузке файлов через формы: пользователь может передать имя вида '../../etc/passwd' или имя с пробелами и спецсимволами, и такое имя нельзя использовать напрямую.

Синтаксис

from werkzeug.utils import secure_filename secure_filename(filename)

Функция принимает один обязательный параметр filename - исходное имя файла в виде строки. Возвращает очищенное имя файла в виде строки.

Пример

Давайте очистим простое имя файла с пробелами:

from flask import Flask from werkzeug.utils import secure_filename app = Flask(__name__) @app.route('/') def index(): res = secure_filename('my file.txt') return res

Результат выполнения кода:

"my_file.txt"

Пример

Давайте попробуем передать опасное имя с путём:

from flask import Flask from werkzeug.utils import secure_filename app = Flask(__name__) @app.route('/') def index(): res = secure_filename('../../etc/passwd') return res

Результат выполнения кода:

"etc_passwd"

Как видите, все слеши и опасные элементы пути были заменены на подчёркивания, и файл нельзя записать за пределы нужной директории.

Пример

Давайте применим функцию при загрузке файла из формы. Сначала создадим шаблон:

<form method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit"> </form>

Теперь напишем обработчик, который принимает файл и сохраняет его под безопасным именем:

from flask import Flask, render_template, request from werkzeug.utils import secure_filename app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': file = request.files['file'] filename = secure_filename(file.filename) file.save('uploads/' + filename) return filename return render_template('index.html')

Если пользователь выберет файл с именем 'my report.pdf', то в ответе вернётся:

"my_report.pdf"

Смотрите также

  • функцию send_file,
    которая отправляет файл клиенту
  • функцию send_from_directory,
    которая безопасно отдаёт файл из директории
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить