Django в обзоре
Поскольку Django разрабатывался в быстром новостном окружении, он был спроектирован для ускорения и упрощения общих задач веб-разработки. Вот краткий обзор того, как создать веб-приложение, работающее с базой данных, с помощью Django.
Цель данного документа — предоставить достаточно технических подробностей, чтобы вы поняли, как работает Django, но это не обучающий курс и не справочник — но у нас есть оба! Когда вы будете готовы начать проект, вы можете начать с учебника или погрузиться прямо в более подробную документацию.
Проектирование модели
Хотя вы можете использовать Django без базы данных, в нём есть объектно-реляционное отображение, в котором вы описываете структуру вашей базы данных в коде Python.
Синтаксис модели данных предлагает множество богатых способов представления ваших моделей — пока что он решает множество проблем со схемой базы данных, накопившихся за много лет. Вот быстрый пример:
mysite/news/models.pyfrom django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
Установка
Далее, запустите утилиты командной строки Django, чтобы автоматически создать таблицы базы данных:
$ python manage.py makemigrations $ python manage.py migrate
...\> py manage.py makemigrations
...\> py manage.py migrate
Команда makemigrations просматривает все доступные модели и создаёт миграции для тех таблиц, которые ещё не существуют. migrate выполняет миграции и создаёт таблицы в вашей базе данных, а также по желанию предоставляет более богатый контроль схемы.
Используйте бесплатный API
С этим у вас есть свободный и богатый Python API для доступа к вашим данным. API создаётся на лету, никакой генерации кода не требуется:
# Import the models we created from our "news" app
>>> from news.models import Article, Reporter
# No reporters are in the system yet.
>>> Reporter.objects.all()
<QuerySet []>
# Create a new Reporter.
>>> r = Reporter(full_name="John Smith")
# Save the object into the database. You have to call save() explicitly.
>>> r.save()
# Now it has an ID.
>>> r.id
1
# Now the new reporter is in the database.
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>
# Fields are represented as attributes on the Python object.
>>> r.full_name
'John Smith'
# Django provides a rich database lookup API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith="John")
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains="mith")
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist.
# Create an article.
>>> from datetime import date
>>> a = Article(
... pub_date=date.today(), headline="Django is cool", content="Yeah.", reporter=r
... )
>>> a.save()
# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>
# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'
# And vice versa: Reporter objects get API access to Article objects.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>
# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith="John")
<QuerySet [<Article: Django is cool>]>
# Change an object by altering its attributes and calling save().
>>> r.full_name = "Billy Goat"
>>> r.save()
# Delete an object with delete().
>>> r.delete()
Динамичный интерфейс администрирования: это не просто шаблон — это целое здание
После определения ваших моделей Django может автоматически создать профессиональный, готовый к производству административный интерфейс — веб-сайт, который позволяет авторизованным пользователям добавлять, изменять и удалять объекты. Единственный необходимый шаг — зарегистрировать вашу модель в административном сайте:
mysite/news/models.pyfrom django.db import models
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
mysite/news/admin.pyfrom django.contrib import admin from . import models admin.site.register(models.Article)
Философия заключается в том, что вашим сайтом пользуются сотрудники, клиенты или, возможно, только вы — и вам не придётся самим создавать интерфейсы для управления контентом.
Типичный рабочий процесс при создании приложений Django состоит в том, чтобы как можно быстрее создать модели и запустить админские сайты, чтобы ваши сотрудники (или клиенты) могли начать заполнять данные. Затем разрабатывается способ представления данных для публики.
Проектирование URL-адресов
Чистая и элегантная схема URL-адресов — важная деталь высококачественного веб-приложения. Django поощряет красивое проектирование URL-адресов и не включает лишние элементы в URL, такие как .php или .asp.
Чтобы спроектировать URL-адреса для приложения, создайте модуль Python, называемый URLconf. Таблица содержания вашего приложения, она содержит сопоставление между URL-шаблонами и функциями обратного вызова Python. URLconf также служат для разъединения URL-адресов от кода Python.
Вот как может выглядеть URLconf для примера Reporter/Article:
mysite/news/urls.pyfrom django.urls import path
from . import views
urlpatterns = [
path("articles/<int:year>/", views.year_archive),
path("articles/<int:year>/<int:month>/", views.month_archive),
path("articles/<int:year>/<int:month>/<int:pk>/", views.article_detail),
]
Код выше сопоставляет пути URL-адресов с функциями обратного вызова Python («представления»). Строки путей используют теги параметров, чтобы «захватить» значения из URL-адресов. Когда пользователь запрашивает страницу, Django последовательно проходит по каждому пути и останавливается на первом, который соответствует запрошенному URL-адресу. (Если ни один из них не совпадает, Django вызывает специальное представление 404). Это чрезвычайно быстро, потому что пути компилируются в регулярные выражения во время загрузки.
После того, как один из шаблонов URL-адреса совпадёт, Django вызовет указанное представление, которое является функцией Python. Каждое представление получает объект запроса — содержащий метаданные запроса — и значения, захваченные в шаблоне.
Например, если пользователь запросил URL-адрес «/articles/2005/05/39323/», Django вызовет функцию news.views.article_detail(request,
year=2005, month=5, pk=39323).
Написание представлений
Каждое представление отвечает за выполнение одного из двух действий: возвращение объекта HttpResponse, содержащего содержимое запрошенной страницы, или поднятие исключения, например, Http404. Остальное — за вами.
Как правило, представление извлекает данные в соответствии с параметрами, загружает шаблон и отображает шаблон с извлечёнными данными. Вот пример представления для year_archive из примера выше:
mysite/news/views.pyfrom django.shortcuts import render
from .models import Article
def year_archive(request, year):
a_list = Article.objects.filter(pub_date__year=year)
context = {"year": year, "article_list": a_list}
return render(request, "news/year_archive.html", context)
Этот пример использует систему шаблонов Django, которая обладает многими мощными функциями, но стремится оставаться достаточно простой для использования не программистами.
Проектирование шаблонов
Код выше загружает шаблон news/year_archive.html.
Django имеет путь поиска шаблонов, который позволяет минимизировать дублирование шаблонов. В настройках Django вы указываете список каталогов для проверки шаблонов с помощью DIRS. Если шаблон не существует в первом каталоге, он проверяет второй и так далее.
Допустим, шаблон news/year_archive.html был найден. Вот как он может выглядеть:
mysite/news/templates/news/year_archive.html{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}
Переменные заключены в двойные фигурные скобки. {{ article.headline }} означает «Вывести значение атрибута заголовка статьи».
Но точки используются не только для поиска атрибутов. Они также могут выполнять поиск по ключам словаря, индекса и вызывать функции.
Обратите внимание, что {{ article.pub_date|date:"F j, Y" }} использует «трубу» в стиле Unix («|» символ). Это называется фильтром шаблона, и это способ отфильтровать значение переменной. В данном случае фильтр даты форматирует объект Python datetime в заданном формате (как в PHP-функции date).
Вы можете объединить любое количество фильтров. Вы можете написать собственные фильтры шаблонов. Вы можете написать собственные теги шаблонов, которые выполняют пользовательский код Python за кулисами.
Наконец, Django использует понятие «наследования шаблонов». Именно это делает {% extends "base.html" %}. Это означает «Сначала загрузите шаблон с именем «base», в котором определено несколько блоков, и заполните блоки следующими блоками». Короче говоря, это позволяет значительно сократить дублирование в шаблонах: каждый шаблон должен определять только то, что уникально для этого шаблона.
Вот как может выглядеть шаблон «base.html», включая использование статических файлов:
mysite/templates/base.html{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static 'images/sitelogo.png' %}" alt="Logo">
{% block content %}{% endblock %}
</body>
</html>
Проще говоря, он определяет внешний вид сайта (с логотипом сайта) и предоставляет «отверстия» для заполнения дочерними шаблонами. Это означает, что переработку сайта можно выполнить, изменив один файл — базовый шаблон.
Это также позволяет создавать несколько версий сайта с различными базовыми шаблонами, при этом повторно используя дочерние шаблоны. Создатели Django использовали эту технику для создания заметно разных мобильных версий сайтов, создав только новый базовый шаблон.
Обратите внимание, что вам не обязательно использовать систему шаблонов Django, если вы предпочитаете другую систему. Хотя система шаблонов Django особенно хорошо интегрирована с модельным слоем Django, ничего не заставляет вас её использовать. В таком случае вам не обязательно использовать и базу данных Django. Вы можете использовать другой уровень абстракции базы данных, читать XML-файлы, читать файлы с диска или что-нибудь ещё. Каждая часть Django — модели, представления, шаблоны — отделена от следующей.
Это лишь верхушка айсберга
Это был лишь краткий обзор функциональности Django. Вот некоторые другие полезные функции:
- Система кэширования, которая интегрируется с memcached или другими бэкендами.
- Система создания RSS- и Atom-лент, позволяющая создавать RSS- и Atom-ленты путём написания небольшого класса Python.
- Более привлекательные автоматически сгенерированные функции администрирования — этот обзор не затронул даже близко все возможности.
Следующими шагами для вас являются загрузка Django, чтение учебника и присоединение к сообществу. Спасибо за интерес!
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.1/intro/overview/