Анализ структуры проекта 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, который предоставляет множество полезных команд:
Пример
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.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
Определяет модели данных, соответствующие таблицам базы данных:
Пример
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 .models import Product
def product_list(request):
products = Product.objects.all()
return render(request, 'myapp/product_list.html', {'products': products})
admin.py
Настройте административный бэкенд Django:
Пример
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_ROOT = os.path.join(BASE_DIR, 'media')
Практические рекомендации
- Разделение проекта и приложения: Сохраняйте независимость каждого приложения для удобного повторного использования
- Конфигурация окружения: Используйте разные файлы настроек, чтобы различать среды разработки и продакшена
- Управление статическими файламиИспользуется во время разработки
STATICFILES_DIRSИспользуется в продакшенеcollectstatic - Проектирование URL: Определяйте URL на уровне приложения, затем подключайте их на уровне проекта
- Организация шаблоновСоздайте подкаталог для каждого приложения для хранения шаблонов
Различия между продакшеном и средой разработки
| Файл/Конфигурация | Среда разработки | Производственная среда |
|---|---|---|
DEBUG | True(Показывать сведения об ошибках) | False(Скрывать ошибки, записывать в лог-файл) |
| база данных | SQLite (по умолчанию) | PostgreSQL/MySQL (оптимизация производительности) |
| Статические файлы | runserverАвтоматическая служба | ИспользованиеcollectstaticСбор в CDN |
ALLOWED_HOSTS | Пустой список или['localhost'] | Необходимо настроить домен (например,['example.com']) |