JavaRush /Курсы /Модуль 3: Django /Настройка статических и медиа-файлов

Настройка статических и медиа-файлов

Модуль 3: Django
2 уровень , 6 лекция
Открыта

Когда мы разрабатываем веб-приложение, оно редко обходится только серверной логикой и базой данных. Нам нужны стили (CSS), изображения, JavaScript и другие ресурсы, которые пользователь видит или загружает с клиентской стороны. Эти ресурсы называются статическими файлами.

Кроме того, если ваше приложение позволяет пользователям загружать файлы (например, изображения профиля, документы), нам нужно место для их хранения. Такие файлы называются медиа-файлами.

Чем статические файлы отличаются от медиа?

Статические файлы Медиа-файлы
Кто создает Разработчики (CSS, JS, изображения для интерфейса) Пользователи (загружаемые изображения, файлы)
Хранение Обычно размещаются в одной папке, доступны для всех пользователей Хранятся персонализированно, связаны с пользователями через базу данных
Пример Логотип сайта, стили Bootstrap. Изображение профиля пользователя, загруженные документы

1. Обработка статических файлов в Django

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

1.1 Что такое STATIC_URL?

Это базовый URL, по которому ваш проект будет предоставлять статические файлы. Например, если вы установите STATIC_URL = '/static/', то файл example.css, лежащий в статической папке вашего приложения, будет доступен по адресу http://127.0.0.1:8000/static/example.css.

1.2 Основные параметры в settings.py

Откройте ваш settings.py и добавьте такие настройки:

STATIC_URL = '/static/'  # Путь для доступа к статическим файлам

STATICFILES_DIRS = [
    BASE_DIR / "static",  # Локальная папка для статиков
]
  • STATIC_URL определяет URL, с которого статические файлы будут доступны.
  • STATICFILES_DIRS сообщает Django, где искать дополнительные статические файлы.

1.3 Команда collectstatic

Когда вы отправляете приложение на продакшен, Django собирает все статические файлы в одну папку. Это делается командой:

python manage.py collectstatic

Django скопирует все файлы из директорий, указанных в STATICFILES_DIRS, и приложения (например, app_name/static/) в единую папку.

Чтобы указать конечное место для этих файлов, добавим в settings.py:

STATIC_ROOT = BASE_DIR / "staticfiles"  # Папка, куда собираются файлы

1.4 Best Practices для статических файлов

  1. Сохраняйте структурированность. Например, создайте подкаталоги для css, js и images.
  2. Не храните огромные файлы в статике. Для видео и других больших файлов лучше использовать специализированные хранилища.
  3. Используйте hash-названия для файлов на продакшене. Это уменьшает возможность получения устаревших версий файлов клиентами.

2. Работа с медиа-файлами

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

2.1 Настройка медиа-файлов в settings.py

Для начала добавим настройки в settings.py:

MEDIA_URL = '/media/'  # URL для медиа-файлов
MEDIA_ROOT = BASE_DIR / "media"  # Физическая папка для хранения файлов
  • MEDIA_URL — путь для доступа к загруженным (медиа) файлам.
  • MEDIA_ROOT — локальная папка, где файлы будут физически храниться.

2.2 Настройка URL для медиа-файлов

Добавим специальную конфигурацию для разработки, чтобы получать доступ к медиа-файлам. Откройте ваш urls.py (обычно в корне проекта) и измените его следующим образом:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # Ваши другие маршруты
]

if settings.DEBUG:  # Только для режима разработки
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2.3 Использование медиа-файлов в моделях

Вероятнее всего, вы захотите создать модели для обработки загруженных файлов. Например:

from django.db import models

class Profile(models.Model):
    name = models.CharField(max_length=100)
    avatar = models.ImageField(upload_to='avatars/')  # Загрузка в папку avatars/

 
  • Поле upload_to позволяет настроить, в какую поддиректорию будут сохраняться файлы. В данном случае загруженные аватары сохранятся в media/avatars/.

При загрузке файлов не забудьте установить библиотеку Pillow! Она необходима для работы с изображениями:

pip install pillow

3. Инструменты и команды для работы с файлами

3.1 Команда collectstatic

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

3.2 Что делать, если файлы не подгружаются?

Если вы работаете в режиме продакшена, но статики или медиа почему-то недоступны, причина может быть в неправильной конфигурации веб-сервера (например, Nginx или Apache). В таком случае нужно убедиться, что сервер веб-приложения отдаёт файлы из папок STATIC_ROOT и MEDIA_ROOT.

4. Практическое упражнение: связка статических и медиа-файлов

Мы сделаем мини-проект, в котором пользователь может загружать изображение профиля, а интерфейс сайта будет оформлен с помощью CSS.

  1. В вашем settings.py добавьте:
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
  1. В папке проекта создайте структуру для статики:
my_project/
    static/
        css/
            styles.css
    media/
    templates/
        profile.html
  1. Добавьте CSS файл static/css/styles.css:
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f9;
}

.profile {
    max-width: 300px;
    margin: 50px auto;
    padding: 20px;
    background: white;
    border-radius: 8px;
    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}

 
  1. Создайте модель и форму в models.py:
from django.db import models

class UserProfile(models.Model):
    username = models.CharField(max_length=50)
    profile_picture = models.ImageField(upload_to='profiles/')
  1. Используйте форму для загрузки аватара в forms.py:
from django import forms
from .models import UserProfile

class ProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['username', 'profile_picture']
  1. Добавьте представление и шаблон для профиля:
from django.shortcuts import render
from .forms import ProfileForm

def profile_view(request):
    form = ProfileForm(request.POST or None, request.FILES or None)
    if request.method == 'POST' and form.is_valid():
        form.save()
    return render(request, 'profile.html', {'form': form})

И добавьте profile.html:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
    <div class="profile">
        <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">Upload Profile</button>
        </form>
    </div>
</body>
</html>

Теперь можно запустить сервер, загрузить аватар, и насладиться стилями!

На этом этапе вы понимаете, как настраивать статику и медиа в Django. Умение работать с файлами делает ваше приложение полноценным и готовым к использованию пользователями.

1
Задача
Модуль 3: Django, 2 уровень, 6 лекция
Недоступна
Настройка STATIC_URL
Настройка STATIC_URL
1
Задача
Модуль 3: Django, 2 уровень, 6 лекция
Недоступна
Работа с медиа-файлами
Работа с медиа-файлами
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Уровень 59
24 июня 2025
Шпаргалка для невнимательных (как я). Для того, чтобы мини-проект заработал, надо: 1)

pip install pillow
2) Поместить папку templates в папку приложения (вы же создали и зарегистрировали приложение?), а не в корень проекта 3) Прописать в ursl.py правильный урл, на который будет вызываться profile_view() 4) В начале хтмл-шаблона добавить строчку

 {% load static %}
5) Совершить миграции

python manage.py makemigrations
python manage.py migrate
Ну и не надо забывать про

if settings.DEBUG:  # Только для режима разработки
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)