Приложения Django работают с файлами любых форматов – растровыми и векторными изображениями, аудио, видео, архивами и всевозможными документами. Путь к файлам можно указывать точно так же, как в обычных Python скриптах, но проще воспользоваться встроенным инструментом для работы с пользовательскими файлами – папкой media.
Зачем нужна папка media в Django
В папке media размещаются файлы, которые загружаются или создаются пользователями – изображения профилей, фотографии, документы, презентации, аудио, видео и так далее. Django обеспечивает безопасное хранение и обслуживание этих файлов, а также предоставляет удобные методы для их обработки и отображения в приложении. Другими словами, использование папки media в Django значительно упрощает работу с пользовательскими файлами.
Заметим, что media используется для размещения именно пользовательских файлов, а не статических. Статические файлы являются неотъемлемой частью приложения, не претерпевают никаких изменений со стороны пользователя и хранятся в папке static. Подробнее со статическими файлами мы разберемся в следующей главе.
Как настроить media в Django
Прежде всего, нужно создать папку media в корневой директории проекта, на одном уровне с приложениями:
Затем нужно добавить import os
и эти строки в файл настроек config/settings.py:
Кроме того, надо внести дополнения в в главный файл маршрутов config/urls.py:
Файлы вместо базы данных в Django
Хотя веб-приложения обычно работают с базами данных, иногда возникает необходимость сохранять информацию в файлах. Например, конфигурационные файлы JSON и YAML используют для хранения настроек, а Markdown файлы заменяют базу данных в генераторах статических сайтов. Кроме того, веб-приложения часто используют файлы JSON, XLSX, CSV и для загрузки информации в базу данных, и для экспорта данных из БД.
В простых веб-приложениях файлы JSON, XLSX, CSV и YAML вполне могут заменить базу данных. Рассмотрим использование данных из различных файлов на примере приложения students.
Работа с YAML-файлами в Django
В этом примере мы будем использовать YAML файл, поэтому нам нужно установить PyYAML:
Сохраните файл students.yaml в папке media. Поскольку Django знает,
где находится media, путь к файлу выглядит как 'media/students.yaml'
. Функция представления students/views.py загружает сведения о студентах из YAML-файла и передает данные в шаблон student_list.html:
В шаблоне для создания списка используется HTML тег <ul></ul>
, а для вывода пунктов – тег <li></li>
:
Добавьте маршрут для вызова функции в файл students/urls.py:
И включите маршруты приложения students в список маршрутов в config/urls.py:
Запустите сервер, перейдите по адресу http://localhost:8000/students/ – приложение успешно загружает данные из файла students.yaml:
Как использовать CSV-файлы в Django
Во втором примере мы воспользуемся файлом students.csv. Для загрузки данных нужно переписать функцию представления в students/views.py, а шаблон и urls.py останутся неизменными:
Результат будет аналогичен первому примеру:
Как работать с JSON-файлами в Django
Для загрузки данных из JSON-файлов Django использует модуль json из стандартной библиотеки Python, поэтому для этого примера не придется ничего устанавливать. Функция представления будет выглядеть так:
Как загружать данные из Excel в Django
Для работы с Excel таблицами в Django можно использовать библиотеку Pandas, которая позволяет загружать данные из XLSX-файлов максимально просто:
Другой способ немного сложнее, зато он позволяет обойтись компактным модулем openpyxl:
Результат будет одинаковым:
Проект 1: Приложение Books для хранения информации о книгах
Мы разработаем приложение, которое будет использовать XLSX-файл вместо базы данных. Код готового приложения находится здесь.
Хотя Django может работать с практически любыми файлами, удобнее всего использовать именно XLSX, поскольку такие файлы можно редактировать с помощью любого приложения для работы с электронными таблицами – Excel, Google Sheets, LibreOffice Calc и так далее. Таблица, в которой хранятся данные о книгах, выглядит так:
Обзор проекта
Приложение будет выводить данные из файла books.xlsx, который хранится в папке media. Для каждой книги выводится одинаковый набор данных:
- название;
- автор;
- жанр;
- год издания;
- краткое содержание;
- обложка.
Обложки находятся в media/covers.
Предусмотрено переключение темы со светлой на темную:
Приступаем к работе
Создайте виртуальное окружение и активируйте его:
Поместите файл requirements.txt в myproject и установите все нужные зависимости:
Создайте проект config и приложение books:
Теперь нужно зарегистрировать приложение books в config/settings.py и добавить туда же настройки для папки media:
Не забудьте добавить настройки media в файл config/urls.py:
Напомним, что папка media располагается на одном уровне с приложением books. В media находится файл books.xlsx и вложенная директория covers, в которой хранятся обложки книг.
Функции представления views.py
Все основные действия по извлечению из Excel-файла информации о книгах выполняет get_books(). Остальные функции, которые выводят список всех книг, а также книги конкретных жанров, полагаются на get_books():
При обработке данных из файла media/books.xlsx функция пропускает первую строку с названиями столбцов.
Порядковый номер и год выпуска преобразуются в целые числа int()
, так как по умолчанию модуль openpyxl
считает их float()
.
Если приложение использует не локальный файл books.xlsx из папки media, а таблицу Google Sheets, то функции будут выглядеть так:
Заметим, что при использовании данных из таблицы Google Sheets имеет смысл хранить изображения не на локальном сервере, а загружать на подходящий фотохостинг. В этом случае в столбце Обложка нужно указывать прямую ссылку на изображение.
Данные передаются в шаблон books.html. Обратите внимание, что шаблон books.html наследует базовый шаблон base.html, в котором:
- Определена общая для всех страниц разметка.
- Подключен Bootstrap – CSS/HTML/JS фреймворк.
- Заданы дополнительные CSS стили
<style></style>
. - Содержится JS-скрипт, который переключает тему со светлой на темную и запоминает выбор пользователя в localStorage браузера.
Подробнее механизмы наследования и включения шаблонов мы рассмотрим в главе, посвященной шаблонизатору Django. Заметим, что дополнительные CSS стили и JS-скрипты для крупных проектов обычно хранятся в отдельных файлах в папке static – с этой концепцией мы подробно разберемся в разделе «Статические файлы».
Вывод данных в шаблоне происходит в цикле:
Для ограничения описания книги до 120 символов используется
конструкция |truncatechars:"120"|linebreaks
. Ссылка,
привязанная к кнопке «Подробнее», обеспечивает передачу в функцию book_detail()
порядкового номера книги – так Django узнает,
о какой именно книге нужно вывести информацию на отдельной странице:
Верхнее меню содержит ссылки на другие функции представления, которые обеспечивают вывод книг по жанрам:
При нажатии на эти ссылки происходит запуск соответствующих функций представления в books/views.py:
- thriller() – выбирает из books.xlsx все триллеры;
- mystery() – выводит детективы;
- fantasy() – отбирает книги в жанре фэнтези;
- programming() – выбирает книги по программированию.
Маршруты, которые приводят в действие все эти функции, определены в books/urls.py:
Все классы, используемые в шаблонах (например, class="card-text">
) являются классами Bootstrap. Классы позволяют применять к
элементам шаблона наборы CSS
стилей, которые обеспечивают тексту и изображениям привлекательный внешний вид.
Стили можно дополнять, а при необходимости – полностью переопределять. Например,
в шаблоне base.html мы
определяем два стиля, которые обеспечивают фиксированную позицию для футера –
внизу страницы:
Без этих стилей футер не будет «прилипать» к низу страницы, если на ней мало контента:
Подведем итоги
Небольшие веб-приложения вполне могут обойтись без базы данных. К тому же использование файла вместо БД может быть оптимальным решением в том случае, если над сбором данных работают несколько человек: предоставить общий доступ к XLSX-файлу гораздо проще, чем к базе.
Содержание курса
- Часть 1: Django — что это? Обзор и установка фреймворка, структура проекта
- Проект 1: Веб-приложение на основе XLSX вместо базы данных
- Часть 2: ORM и основы работы с базами данных
- Проект 2: Портфолио разработчика
Комментарии