Django: фреймворк для создания веб-приложений на Python за минуты

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Начинающие разработчики, интересующиеся веб-разработкой на Python
  • Студенты и участники курсов по программированию, желающие овладеть Django
  • Специалисты, стремящиеся повысить свои навыки и создать портфолио проектов

    Вы когда-нибудь задумывались, как быстро создать полноценное веб-приложение на Python? Django — именно тот инструмент, который позволит вам перейти от написания простых скриптов к разработке мощных веб-систем за минимальное время. Этот фреймворк, созданный перфекционистами для перфекционистов, избавляет от большинства рутинных задач веб-разработки и позволяет сосредоточиться на уникальной логике вашего приложения. Готовы превратить свои знания Python в реальные веб-проекты? 🚀

Хотите за 9 месяцев стать профессиональным Python-разработчиком? Курс Python-разработки от Skypro включает углубленное изучение Django и других востребованных технологий. Вы создадите собственное портфолио из 15+ проектов, а команда карьерных консультантов поможет найти работу с зарплатой от 90 000 рублей. Никакой скучной теории — только практика под руководством экспертов из IT-компаний!

Django для новичков: что это и почему стоит изучать

Django — это высокоуровневый веб-фреймворк на Python, созданный для разработчиков, которые ценят своё время. Представьте, что вы строите дом: вместо того, чтобы самостоятельно изготавливать кирпичи, Django предоставляет готовые строительные блоки и чертежи. Вам остаётся только решить, какой дом вы хотите построить. 🏗️

Фреймворк следует принципу "батарейки включены", что означает наличие всего необходимого для создания веб-приложений прямо "из коробки":

  • Встроенная административная панель
  • Система аутентификации пользователей
  • ORM (Object-Relational Mapping) для работы с базами данных
  • Мощная система маршрутизации URL
  • Шаблонизатор для генерации HTML
  • Защита от распространённых уязвимостей

Александр Петров, Senior Backend Developer

Когда я только начинал изучать веб-разработку, я потратил месяцы на создание собственных функций для валидации форм, обработки URL и работы с базой данных. Переход на Django стал для меня настоящим откровением. Первое, что меня поразило — административная панель, которая генерируется автоматически. Помню свой шок, когда после всего 20 минут настройки я получил полнофункциональный интерфейс для управления данными. То, что раньше занимало недели, теперь требовало считанных часов. Мой первый коммерческий проект на Django — онлайн-платформа для образовательных курсов — был запущен всего за три недели, включая тестирование и деплой.

Почему стоит выбрать именно Django для изучения веб-разработки на Python? Давайте сравним его с другими популярными вариантами:

Фреймворк Скорость разработки Масштабируемость Экосистема Порог вхождения
Django Высокая Отличная Обширная Средний
Flask Средняя Хорошая Умеренная Низкий
FastAPI Высокая Отличная Растущая Средний
Pyramid Средняя Отличная Ограниченная Высокий

Django используют такие крупные проекты как Spotify, Dropbox, Instagram, Pinterest и The Washington Post. Это свидетельствует о его надёжности и масштабируемости. Для начинающих разработчиков особенно ценны качественная документация и активное сообщество, готовое помочь с решением любых проблем.

Пошаговый план для смены профессии

Настройка Django: как установить и создать первый проект

Перед установкой Django убедитесь, что на вашем компьютере установлен Python (желательно версии 3.8 или выше) и пакетный менеджер pip. Давайте приступим к настройке рабочего окружения. 🛠️

Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта. Вот пошаговая инструкция для установки:

  1. Создайте виртуальное окружение:
python -m venv django_env

  1. Активируйте виртуальное окружение:
    • Windows:
django_env\Scripts\activate

  • macOS/Linux:
source django_env/bin/activate

  1. Установите Django:
pip install django

  1. Проверьте установку:
python -m django --version

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

django-admin startproject myproject

Эта команда создаст каталог с базовой структурой проекта. Давайте разберёмся, что означает каждый файл:

Файл/Директория Назначение
manage.py Утилита командной строки для управления проектом
myproject/ Пакет Python для вашего проекта
myproject/init.py Пустой файл, указывающий Python, что этот каталог является пакетом
myproject/settings.py Настройки и конфигурация проекта
myproject/urls.py Декларации URL для проекта (таблица маршрутизации)
myproject/asgi.py Точка входа для ASGI-совместимых веб-серверов
myproject/wsgi.py Точка входа для WSGI-совместимых веб-серверов

Django организован по принципу "проект содержит приложения". Проект — это веб-сайт целиком, а приложения — функциональные модули сайта (например, блог, форум, магазин). Создадим наше первое приложение:

cd myproject
python manage.py startapp myapp

Теперь нужно зарегистрировать приложение в проекте. Откройте файл myproject/settings.py и добавьте 'myapp' в список INSTALLED_APPS:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]

После этих настроек можно запустить встроенный сервер разработки и убедиться, что всё работает:

python manage.py runserver

Если вы увидите сообщение о том, что сервер запущен (обычно на http://127.0.0.1:8000/), значит, всё настроено правильно! 🎉

Основы архитектуры Django: MTV и как программировать на Python

Django основан на архитектурном паттерне MTV (Model-Template-View), который является адаптацией более известного паттерна MVC (Model-View-Controller). Понимание этой архитектуры — ключ к эффективному использованию Django. 🧩

Давайте рассмотрим, как соотносятся компоненты MTV с традиционным MVC:

  • Model (Модель) — компонент, ответственный за данные и их структуру, аналогичен модели в MVC
  • Template (Шаблон) — отвечает за представление данных пользователю, аналогичен представлению (View) в MVC
  • View (Представление) — обрабатывает запросы и связывает модели с шаблонами, аналогичен контроллеру (Controller) в MVC

Когда пользователь делает запрос к Django-приложению, происходит следующая последовательность действий:

  1. URL-диспетчер определяет, какое представление должно обработать запрос
  2. Представление запрашивает нужные данные из модели
  3. Модель получает данные из базы данных
  4. Представление передаёт данные в шаблон
  5. Шаблон рендерит HTML, который отправляется пользователю

Теперь давайте создадим простое представление, чтобы понять, как программировать на Python в контексте Django. Откройте файл myapp/views.py и добавьте следующий код:

Python
Скопировать код
from django.http import HttpResponse

def hello_world(request):
return HttpResponse("Привет, Django! Мое первое веб-приложение на Python!")

Чтобы это представление стало доступным, нужно создать файл urls.py в каталоге вашего приложения (myapp/):

Python
Скопировать код
from django.urls import path
from . import views

urlpatterns = [
path('hello/', views.hello_world, name='hello_world'),
]

Затем нужно включить URL-конфигурацию приложения в общую конфигурацию проекта. Откройте myproject/urls.py и внесите изменения:

Python
Скопировать код
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]

Теперь, если вы запустите сервер и перейдёте по адресу http://127.0.0.1:8000/hello/, то увидите сообщение "Привет, Django! Мое первое веб-приложение на Python!".

Мария Соколова, Python-преподаватель

Один из моих учеников долго не мог понять, как работает архитектура Django. Всё изменилось, когда мы перешли от теории к практике. Мы работали над простым приложением для кулинарных рецептов, и я попросила его представить модель как картотеку рецептов, представления как библиотекарей, а шаблоны как страницы книги рецептов. Когда пользователь запрашивает рецепт блинов, URL-маршрутизатор направляет запрос нужному "библиотекарю" (представлению). Библиотекарь находит карточку рецепта (модель) и вставляет информацию в красиво оформленную страницу книги (шаблон), которую передаёт пользователю. После этой аналогии все кусочки пазла встали на свои места, и ученик не только быстро освоил Django, но и стал одним из самых активных участников нашего курса.

Django также предоставляет более мощные инструменты для создания представлений. Например, класс-представления (Class-Based Views), которые позволяют использовать преимущества объектно-ориентированного программирования:

Python
Скопировать код
from django.views.generic import TemplateView

class HelloWorldView(TemplateView):
template_name = "hello.html"

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['message'] = "Привет, Django! Мое первое веб-приложение на Python!"
return context

А для работы с шаблонами нужно создать файл hello.html в каталоге templates вашего приложения:

HTML
Скопировать код
<!DOCTYPE html>
<html>
<head>
<title>Приветствие</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>

Не забудьте создать каталог templates/myapp/ внутри вашего приложения и обновить настройки в urls.py, чтобы использовать новое класс-представление.

Создаём базу данных: модели и миграции в Django

Одна из самых мощных функций Django — это его ORM (Object-Relational Mapping), который позволяет работать с базой данных через Python-объекты вместо написания SQL-запросов. Модели Django определяют структуру данных и автоматически создают соответствующие таблицы в базе данных. 📊

Давайте создадим простую модель для блога. Откройте файл myapp/models.py и добавьте следующий код:

Python
Скопировать код
from django.db import models
from django.utils import timezone

class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(default=timezone.now)

def __str__(self):
return self.title

Здесь мы определили модель BlogPost с тремя полями: title (заголовок), content (содержание) и publisheddate (дата публикации). Метод _str__ определяет, как объект будет отображаться в административной панели и консоли.

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

Bash
Скопировать код
python manage.py makemigrations myapp
python manage.py migrate

Первая команда создаёт файлы миграций на основе изменений в ваших моделях, а вторая применяет эти миграции к базе данных.

Django поддерживает различные типы полей для моделей. Вот самые распространённые из них:

Тип поля Описание Пример использования
CharField Строка ограниченной длины Имя пользователя, заголовок
TextField Текст неограниченной длины Содержание статьи, комментарий
IntegerField Целое число Возраст, количество просмотров
DateTimeField Дата и время Дата публикации, дата регистрации
BooleanField Логическое значение Статус активности, флаг подписки
ForeignKey Связь "многие-к-одному" Автор статьи, категория товара
ManyToManyField Связь "многие-ко-многим" Теги статей, участники проекта

Давайте расширим наш пример, добавив модели для категорий и комментариев:

Python
Скопировать код
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField(blank=True)

def __str__(self):
return self.name

class Meta:
verbose_name_plural = "Categories"

class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published_date = models.DateTimeField(default=timezone.now)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='posts')

def __str__(self):
return self.title

class Comment(models.Model):
post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, related_name='comments')
author_name = models.CharField(max_length=100)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)

def __str__(self):
return f"Comment by {self.author_name} on {self.post.title}"

В этом примере мы добавили:

  • Связь "многие-к-одному" между BlogPost и Category (один пост может принадлежать только одной категории, но в категории может быть много постов)
  • Связь "многие-к-одному" между Comment и BlogPost (один пост может иметь много комментариев)
  • Параметр on_delete=models.CASCADE указывает, что при удалении категории или поста все связанные объекты также будут удалены
  • Параметр related_name задаёт имя для обратной связи (например, category.posts позволяет получить все посты в категории)

После определения этих моделей не забудьте создать и применить миграции:

Bash
Скопировать код
python manage.py makemigrations myapp
python manage.py migrate

Теперь вы можете создавать и запрашивать объекты через Django ORM:

Python
Скопировать код
from myapp.models import Category, BlogPost, Comment

# Создание категории
tech = Category.objects.create(name="Technology", description="All about tech")

# Создание поста
post = BlogPost.objects.create(
title="Введение в Django",
content="Django — это потрясающий фреймворк для веб-разработки на Python.",
category=tech
)

# Создание комментария
comment = Comment.objects.create(
post=post,
author_name="John Doe",
text="Отличная статья, спасибо!"
)

# Получение всех постов в категории
tech_posts = tech.posts.all()

# Получение всех комментариев к посту
post_comments = post.comments.all()

Django ORM предоставляет мощный API для фильтрации и сортировки данных, что позволяет выполнять сложные запросы без написания SQL.

От кода к сайту: как запустить своё первое Django-приложение

После настройки моделей пора сделать наш проект действительно функциональным, создав представления для отображения данных и интерфейс для взаимодействия с пользователями. Разберёмся, как превратить наш код в полноценный веб-сайт. 🌐

Начнём с создания представлений для нашего блога. Откройте файл myapp/views.py и добавьте следующие представления:

Python
Скопировать код
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from .models import BlogPost, Category

class BlogListView(ListView):
model = BlogPost
template_name = 'myapp/blog_list.html'
context_object_name = 'posts'
ordering = ['-published_date']

class BlogDetailView(DetailView):
model = BlogPost
template_name = 'myapp/blog_detail.html'
context_object_name = 'post'

def category_posts(request, category_id):
category = get_object_or_404(Category, id=category_id)
posts = category.posts.all().order_by('-published_date')
return render(request, 'myapp/category_posts.html', {'category': category, 'posts': posts})

Теперь настроим URL-маршруты для этих представлений. Откройте или создайте файл myapp/urls.py:

Python
Скопировать код
from django.urls import path
from . import views

urlpatterns = [
path('', views.BlogListView.as_view(), name='blog_list'),
path('post/<int:pk>/', views.BlogDetailView.as_view(), name='blog_detail'),
path('category/<int:category_id>/', views.category_posts, name='category_posts'),
]

Для работы наших представлений нам понадобятся шаблоны. Создайте следующие файлы в каталоге templates/myapp/:

  1. base.html — базовый шаблон для всех страниц:
HTML
Скопировать код
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Мой блог на Django{% endblock %}</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 0;
padding: 0;
color: #333;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
header {
background-color: #4CAF50;
color: white;
padding: 10px 0;
text-align: center;
}
nav {
background-color: #f8f9fa;
padding: 10px 0;
}
nav ul {
list-style-type: none;
padding: 0;
display: flex;
justify-content: center;
}
nav ul li {
margin: 0 15px;
}
nav a {
text-decoration: none;
color: #333;
}
.post {
margin-bottom: 30px;
border-bottom: 1px solid #eee;
padding-bottom: 20px;
}
footer {
text-align: center;
margin-top: 30px;
padding: 20px 0;
background-color: #f8f9fa;
}
</style>
</head>
<body>
<header>
<div class="container">
<h1>Мой блог на Django</h1>
</div>
</header>

<nav>
<div class="container">
<ul>
<li><a href="{% url 'blog_list' %}">Главная</a></li>
{% for cat in categories %}
<li><a href="{% url 'category_posts' cat.id %}">{{ cat.name }}</a></li>
{% endfor %}
</ul>
</div>
</nav>

<div class="container">
{% block content %}
{% endblock %}
</div>

<footer>
<div class="container">
<p>© 2023 Мой блог на Django</p>
</div>
</footer>
</body>
</html>

  1. blog_list.html — список всех постов:
HTML
Скопировать код
{% extends 'myapp/base.html' %}

{% block title %}Все посты | Мой блог на Django{% endblock %}

{% block content %}
<h2>Последние посты</h2>

{% for post in posts %}
<div class="post">
<h3><a href="{% url 'blog_detail' post.id %}">{{ post.title }}</a></h3>
<p>{{ post.content|truncatewords:30 }}</p>
<p><small>Категория: <a href="{% url 'category_posts' post.category.id %}">{{ post.category.name }}</a> | 
Опубликовано: {{ post.published_date|date:"d.m.Y H:i" }}</small></p>
</div>
{% empty %}
<p>На данный момент нет доступных постов.</p>
{% endfor %}
{% endblock %}

  1. blog_detail.html — детальная страница поста:
HTML
Скопировать код
{% extends 'myapp/base.html' %}

{% block title %}{{ post.title }} | Мой блог на Django{% endblock %}

{% block content %}
<div class="post-detail">
<h2>{{ post.title }}</h2>
<p><small>Категория: <a href="{% url 'category_posts' post.category.id %}">{{ post.category.name }}</a> | 
Опубликовано: {{ post.published_date|date:"d.m.Y H:i" }}</small></p>

<div class="post-content">
{{ post.content|linebreaks }}
</div>

<h3>Комментарии ({{ post.comments.count }})</h3>
{% for comment in post.comments.all %}
<div class="comment">
<p><strong>{{ comment.author_name }}</strong> <small>{{ comment.created_date|date:"d.m.Y H:i" }}</small></p>
<p>{{ comment.text|linebreaks }}</p>
</div>
{% empty %}
<p>Нет комментариев. Будьте первым!</p>
{% endfor %}
</div>
{% endblock %}

  1. category_posts.html — посты определённой категории:
HTML
Скопировать код
{% extends 'myapp/base.html' %}

{% block title %}{{ category.name }} | Мой блог на Django{% endblock %}

{% block content %}
<h2>Посты в категории: {{ category.name }}</h2>

{% if category.description %}
<p>{{ category.description }}</p>
{% endif %}

{% for post in posts %}
<div class="post">
<h3><a href="{% url 'blog_detail' post.id %}">{{ post.title }}</a></h3>
<p>{{ post.content|truncatewords:30 }}</p>
<p><small>Опубликовано: {{ post.published_date|date:"d.m.Y H:i" }}</small></p>
</div>
{% empty %}
<p>В этой категории ещё нет постов.</p>
{% endfor %}
{% endblock %}

Чтобы отобразить категории в навигационном меню, нам нужно добавить их в контекст всех шаблонов. Для этого создайте файл myapp/context_processors.py:

Python
Скопировать код
from .models import Category

def categories_processor(request):
return {
'categories': Category.objects.all()
}

И добавьте этот процессор контекста в настройки проекта (myproject/settings.py):

Python
Скопировать код
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'myapp.context_processors.categories_processor', # Добавьте эту строку
],
},
},
]

Осталось настроить административную панель для удобного управления контентом. Откройте myapp/admin.py и добавьте следующий код:

Python
Скопировать код
from django.contrib import admin
from .models import Category, BlogPost, Comment

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name', 'description')
search_fields = ('name',)

@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'category', 'published_date')
list_filter = ('category', 'published_date')
search_fields = ('title', 'content')
date_hierarchy = 'published_date'

@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
list_display = ('author_name', 'post', 'created_date')
list_filter = ('created_date',)
search_fields = ('author_name', 'text', 'post__title')

Теперь создайте суперпользователя для доступа к административной панели:

Bash
Скопировать код
python manage.py createsuperuser

Запустите сервер разработки и перейдите по адресу http://127.0.0.1:8000/admin/, чтобы добавить несколько категорий и постов. После этого посетите http://127.0.0.1:8000/, чтобы увидеть ваш блог в действии!

Освоение Django открывает перед вами бескрайние горизонты веб-разработки на Python. Начав с понимания базовых концепций — моделей, представлений и шаблонов — вы получаете мощный инструментарий для создания практически любых веб-приложений. Пусть ваш первый проект будет простым, но каждая новая функция, добавленная вами самостоятельно, станет кирпичиком в фундаменте вашего профессионального роста. Не бойтесь экспериментировать и задавать вопросы сообществу — путь к мастерству в Django лежит через практику и любопытство.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какая из следующих функций является одной из основных особенностей Django?
1 / 5

Загрузка...