Анализ структуры проекта Django

Понимая структуру проекта Django, мы можем эффективнее организовывать код, следовать лучшим практикам Django и создавать поддерживаемые веб-приложения.

В предыдущей главе мы научились использоватьdjango-admin startprojectКогда команда создает новый проект, Django автоматически генерирует следующую базовую структуру:
myproject/
│
├── manage.py
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Используйте django-admin для создания проекта HelloWorld:

django-admin startproject HelloWorld

После создания мы можем просмотреть структуру каталогов проекта:

Файл/каталогПодробное описание
manage.pyИнструмент управления командной строкой для проектов Django, который инкапсулируетdjango-adminфункциональность и автоматически задаетDJANGO_SETTINGS_MODULEПеременная окружения указывает на конфигурацию текущего проекта. Все команды управления проектом выполняются через нее, например:
- runserver: Запуск сервера разработки
- makemigrations: Создание файлов миграции базы данных
- shell: Запуск оболочки Python с ORM
db.sqlite3Файл базы данных SQLite, используемый Django по умолчанию, который автоматически генерируется после первого выполненияmigrateОн автоматически генерируется после выполнения команды. Он подходит для сред разработки; для production рекомендуется переключиться на PostgreSQL/MySQL. Расположение файла определяетсяsettings.pyinDATABASES['default']['NAME']определением.
__pycache__/Каталог кэша байт-кода, создаваемый интерпретатором Python, содержащий.pycфайл, используемый для ускорения загрузки модулей. Его не нужно коммитить в систему контроля версий (должен быть в.gitignoreигнорируется в).


Разбор основных файлов

manage.py

manage.pyявляется точкой входа инструмента командной строки для проектов Django, который предоставляет множество полезных команд:

Пример

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # Обработка ошибок импорта
        pass
    execute_from_command_line(sys.argv)

Примеры основных команд:

  • python manage.py runserver- Запуск сервера разработки
  • python manage.py migrate- Применение миграций базы данных
  • python manage.py createsuperuser- Создание учётной записи администратора

settings.py

settings.py— это файл конфигурации для проектов Django, содержащий все важные настройки:

Пример

# Пояснение ключевых элементов конфигурации:
DEBUG = True  # Во время разработки установите True, чтобы отображались подробные ошибки; в рабочей среде должно быть установлено False.
ALLOWED_HOSTS = []  # Когда DEBUG=False, необходимо указать разрешённые домены (например, ['example.com'])

INSTALLED_APPS = [
    'django.contrib.admin',    # Управление админкой
    'django.contrib.auth',     # Система аутентификации
    'django.contrib.contenttypes',  # Фреймворк типов контента
    'django.contrib.sessions', # Управление сессиями
    'django.contrib.messages', # Фреймворк сообщений
    'django.contrib.staticfiles',  # Управление статическими файлами
    # Можно добавить пользовательское приложение: 'myapp.apps.MyAppConfig'
]

DATABASES = {  # Конфигурация базы данных
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',  # Использовать синтаксис pathlib
        # Пример MySQL:
        # 'ENGINE': 'django.db.backends.mysql',
        # 'NAME': 'mydb',
        # 'USER': 'root',
        # 'PASSWORD': 'password',
    }
}

STATIC_URL = '/static/'  # Префикс URL статических файлов
STATICFILES_DIRS = [BASE_DIR / 'static']  # Каталог поиска статических файлов в режиме разработки
MEDIA_URL = '/media/'   # Префикс URL для файлов, загруженных пользователями
MEDIA_ROOT = BASE_DIR / 'media'  # Путь хранения загруженных файлов

urls.py (диспетчер URL)

Пример

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Маршруты администратора
    path('blog/', include('blog.urls')),  # Маршрутизация URL подприложения
    # path('api/', include('api.urls', namespace='api')),
]
  • include(): реализует модуляризацию маршрутизации, разделяя маршруты разных приложений по соответствующим файлам urls.py.
  • namespace: используется для предотвращения конфликтов имён при обратном разрешении URL.

wsgi.py & asgi.py

ФайлНазначение
wsgi.pyКонфигурация WSGI (Web Server Gateway Interface), используемая для традиционных синхронных серверов (таких как Gunicorn, uWSGI). В продакшене проект запускается через этот файл.
asgi.pyКонфигурация ASGI (Asynchronous Server Gateway Interface), поддерживает различные асинхронные серверы (такие как Daphne, Uvicorn). Используется для WebSocket или асинхронных представлений.

Каталог расширений (не создаётся автоматически, но часто используется)

HelloWorld/
├── apps/               # 推荐:存放所有自定义应用
│   └── blog/          # 示例应用
├── static/             # 静态文件(CSS/JS/图片)
├── media/              # 用户上传文件
├── templates/          # 全局模板目录
└── requirements.txt    # 项目依赖列表

1. Каталог apps/ (рекомендуемая структура)

Управляйте приложениями централизованно, избегая их разбрасывания в корневом каталоге проекта.

Необходимо настроить путь Python в settings.py:

import sys
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

2. Статические файлы и медиафайлы

  • static/Хранит CSS, JavaScript, изображения и т. д., доступ к ним осуществляется через STATIC_URL.

  • media/: Файлы, загруженные пользователем (например, аватары), доступны через MEDIA_URL. Необходимо настроить сервер для предоставления доступа во время разработки:

    # urls.py(仅开发环境)
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Структура приложения Django

В Django проект может содержать несколько приложений. Используяpython manage.py startapp myappПосле создания нового приложения создаётся следующая структура:

myapp/
│
├── migrations/
│   └── __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py

Основные файлы приложения

models.py

Определяет модели данных, соответствующие таблицам базы данных:

Пример

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    description = models.TextField()
   
    def __str__(self):
        return self.name

views.py

Обрабатывайте бизнес-логику, возвращайте ответы:

Пример

from django.shortcuts import render
from .models import Product

def product_list(request):
    products = Product.objects.all()
    return render(request, 'myapp/product_list.html', {'products': products})

admin.py

Настройте административный бэкенд Django:

Пример

from django.contrib import admin
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price')

Пример полной структуры проекта

Полная структура типичного проекта Django выглядит следующим образом:

myproject/
│
├── manage.py
├── requirements.txt
├── static/
│   ├── css/
│   ├── js/
│   └── images/
├── media/
├── templates/
│   └── base.html
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    ├── wsgi.py
    └── asgi.py
└── myapp1/
    ├── migrations/
    ├── templates/
    │   └── myapp1/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py
└── myapp2/
    └── ... (类似结构)

Описание важных каталогов

каталог migrations

Хранит файлы миграций базы данных. Django использует эти файлы для отслеживания изменений моделей и синхронизации их с базой данных.

каталог static

Хранит статические файлы (CSS, JavaScript, изображения и т. д.), которые во время развёртывания собираются в указанное место.

каталог templates

Хранит файлы HTML-шаблонов. Django использует язык шаблонов для динамической генерации страниц.

каталог media

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

Пример

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Практические рекомендации

  1. Разделение проекта и приложения: Сохраняйте независимость каждого приложения для удобного повторного использования
  2. Конфигурация окружения: Используйте разные файлы настроек, чтобы различать среды разработки и продакшена
  3. Управление статическими файламиИспользуется во время разработкиSTATICFILES_DIRSИспользуется в продакшенеcollectstatic
  4. Проектирование URL: Определяйте URL на уровне приложения, затем подключайте их на уровне проекта
  5. Организация шаблоновСоздайте подкаталог для каждого приложения для хранения шаблонов

Различия между продакшеном и средой разработки

Файл/КонфигурацияСреда разработкиПроизводственная среда
DEBUGTrue(Показывать сведения об ошибках)False(Скрывать ошибки, записывать в лог-файл)
база данныхSQLite (по умолчанию)PostgreSQL/MySQL (оптимизация производительности)
Статические файлыrunserverАвтоматическая службаИспользованиеcollectstaticСбор в CDN
ALLOWED_HOSTSПустой список или['localhost']Необходимо настроить домен (например,['example.com'])
Другие расширения