Создание веб-приложений с помощью фреймворка Django

Раздел: Разработка на Python -> Веб-разработка

Основы фреймворка Django

Django – это высокоуровневый веб-фреймворк на Python, который позволяет быстро создавать безопасные и поддерживаемые веб-приложения. Он следует архитектуре MTV (Model-Template-View) и включает множество встроенных компонентов: ORM, аутентификацию, административный интерфейс, маршрутизацию и другие. Основное преимущество – автоматизация рутинных задач, что ускоряет разработку. Ниже рассмотрен процесс создания простейшего проекта.

Установка фреймворка выполняется через pip:

pip install django

создание сайтов python django (создание веб-сайтов на django с использованием python)

После установки создается проект командой django-admin startproject:

django-admin startproject mysite

Python web django (web-фреймворк django)

Внутри проекта создается приложение:

python manage.py startapp myapp

Python web flask (web-фреймворк flask)

Необходимо добавить приложение в список INSTALLED_APPS в файле settings.py:

INSTALLED_APPS = [
    ...
    'myapp',
]

Python web server (web-сервер на python)

Создадим простой view в файле myapp/views.py:

from django.http import HttpResponse

def index(request):
    return HttpResponse('Привет, мир!')

Python 3 веб приложение (веб-приложение на python 3)

Настроим URL в myapp/urls.py (создать файл) и подключим его в корневом urls.py:

# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

# mysite/urls.py
from django.urls import include, path

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

Python веб сервисы (веб-сервисы на python)

Запускаем сервер разработки:

python manage.py runserver

примеры python веб (примеры веб-разработки на python)

При переходе по адресу http://127.0.0.1:8000/ браузер отобразит строку 'Привет, мир!'.

Проблемы и ошибки:
- ImportError: No module named 'myapp' – приложение не добавлено в INSTALLED_APPS.
- ModuleNotFoundError: No module named 'myapp.urls' – не создан файл urls.py в приложении или не подключен include.
- TemplateDoesNotExist (возникает при использовании render) – проверьте пути к шаблонам.

Как отобразить динамическую страницу с данными с помощью шаблонов?

Для отображения динамического содержимого используются шаблоны. Django использует собственный язык шаблонов. Необходимо создать папку templates в приложении или проекте и настроить TEMPLATES в settings.py. Пример настройки DIRS:

TEMPLATES = [
    {
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        ...
    },
]

создание сайта на python (создание сайта на python)

Создаем шаблон templates/index.html:

<h2>Привет, {{ name }}!</h2>

Django python создание приложения (создание веб-приложения на django)

Используем функцию render в view:

from django.shortcuts import render

def index(request):
    context = {'name': 'Иван'}
    return render(request, 'index.html', context)

библиотека django python (библиотека django для веб-разработки на python)

Результат: на странице отобразится 'Привет, Иван!'.

Типичные ошибки:
- TemplateDoesNotExist: index.html – проверьте, что файл находится в правильной папке, указанной в DIRS или в каталоге шаблонов приложения (если APP_DIRS=True).
- KeyError: 'name' – если переменная не передана в контекст.

Как работать с данными через ORM Django?

Django ORM позволяет описывать структуру данных с помощью классов-моделей и выполнять запросы к базе данных без написания SQL. Пример модели Product:

from django.db import models

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

Python django практика (практика django на python)

После создания модели выполняются миграции:

python manage.py makemigrations
python manage.py migrate

Использование в view:

from .models import Product

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

В шаблоне можно вывести данные:

<ul>
{% for product in products %}
    <li>{{ product.name }} – {{ product.price }}</li>
{% endfor %}
</ul>
Распространенные проблемы:
- django.db.utils.OperationalError: no such table – не выполнены миграции (migrate).
- TypeError: Model.__init__() got an unexpected keyword argument – несоответствие полей в модели и переданных аргументов.
- Конфликты миграций при работе в команде – рекомендуется использовать python manage.py makemigrations --merge.

Как создать REST API для внешних клиентов с помощью Django REST Framework?

Django REST Framework (DRF) – популярная библиотека для создания RESTful API. Установка:

pip install djangorestframework

Добавление в INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    'rest_framework',
]

Создание сериализатора для модели Product:

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

ViewSet для обработки запросов:

from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

Подключение маршрутов через DefaultRouter:

from rest_framework.routers import DefaultRouter
from .views import ProductViewSet

router = DefaultRouter()
router.register(r'products', ProductViewSet)
urlpatterns = router.urls

Теперь по адресу /api/products/ доступен CRUD для модели Product.

Возможные трудности:
- 404 Not Found – не подключены маршруты роутера, проверьте urlpatterns.
- SerializationError: Object is not JSON serializable – если в модели есть поля, не поддерживаемые по умолчанию (например, ImageField), требуется кастомная сериализация.
- PermissionDenied – отсутствуют права доступа, настройте permission_classes.

Как управлять данными через встроенный административный интерфейс Django?

Django поставляется с готовой админ-панелью. Для управления моделью её необходимо зарегистрировать в файле admin.py приложения. Пример настройки для Product:

from django.contrib import admin
from .models import Product

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

Создается суперпользователь:

python manage.py createsuperuser

Затем админка доступна по адресу /admin/. В ней можно просматривать, добавлять, редактировать и удалять объекты модели.

Типичные ошибки:
- Model not registered – забыли добавить модель в admin.py.
- AttributeError: 'Product' object has no attribute 'price' – если поле не существует или опечатка в list_display.
- Permission denied – пользователь не имеет прав персонала (is_staff) или суперпользователя.

Расширенные примеры использования Django

Для демонстрации более сложного сценария создадим приложение для управления статьями с использованием Class-Based Views (CBV) и ModelForm. Это позволит увидеть, как Django автоматизирует обработку форм и списков.

Модель Article с полями заголовка, содержимого и даты публикации:

Пример
# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

Форма на основе модели:

Пример
# forms.py
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'content']

Представления: список статей (ListView) и создание новой статьи (CreateView):

Пример
# views.py
from django.views.generic import ListView, CreateView
from django.urls import reverse_lazy
from .models import Article
from .forms import ArticleForm

class ArticleListView(ListView):
    model = Article
    template_name = 'articles/article_list.html'
    context_object_name = 'articles'

class ArticleCreateView(CreateView):
    model = Article
    form_class = ArticleForm
    template_name = 'articles/article_form.html'
    success_url = reverse_lazy('article-list')

Маршруты:

Пример
# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.ArticleListView.as_view(), name='article-list'),
    path('create/', views.ArticleCreateView.as_view(), name='article-create'),
]

Шаблоны. Список статей (templates/articles/article_list.html):

Пример
<h2>Статьи</h2>
<ul>
{% for article in articles %}
    <li>{{ article.title }} ({{ article.pub_date|date:'d.m.Y' }})</li>
{% empty %}
    <li>Пока нет статей.</li>
{% endfor %}
</ul>
<a href='{% url 'article-create' %}'>Добавить статью</a>

Форма создания статьи (templates/articles/article_form.html):

Пример
<h2>Новая статья</h2>
<form method='post'>
    {% csrf_token %}
    {{ form.as_p }}
    <button type='submit'>Сохранить</button>
</form>
<a href='{% url 'article-list' %}'>Назад к списку</a>

Результат работы приложения: при переходе по адресу /articles/ отображается список статей, а по адресу /articles/create/ – форма для добавления новой статьи. После отправки формы происходит перенаправление на список.

Вывод (пример страницы списка):
Статьи
- Первая статья (01.04.2025)
- Вторая статья (02.04.2025)
[Добавить статью]

Дополнительно можно рассмотреть использование сигналов. Например, автоматическое создание профиля пользователя при регистрации. Для этого в файле signals.py приложения пишется обработчик:

Пример
# signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

Затем в конфигурации приложения (apps.py) сигналы подключаются:

Пример
# apps.py
from django.apps import AppConfig

class MyappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

    def ready(self):
        import myapp.signals

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

Библиотека Django для веб-разработки на Python - comments

En
библиотека django python (python)