Django в обзоре
Поскольку Django разрабатывался в быстром темпе новостной среды, он был разработан для ускорения и упрощения обычных задач веб-разработки. Вот краткий обзор того, как создать веб-приложение, работающее с базой данных, с помощью Django.
Цель данного документа — предоставить вам достаточную техническую информацию, чтобы понять, как работает Django, но это не обучающий курс и не справочник — но у нас есть и то, и другое! Когда вы будете готовы начать проект, вы можете начать с учебника или погрузиться в более подробную документацию.
Проектирование модели
Хотя вы можете использовать Django без базы данных, в нём есть объектно-реляционное отображение, в котором вы описываете структуру своей базы данных в коде Python.
Синтаксис модели данных предлагает множество способов представления ваших моделей — до сих пор он успешно решает проблемы с схемами баз данных, накопившиеся за многие годы. Вот быстрый пример:
from 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 migrate
Команда 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 может автоматически создать профессиональный, готовый к производству административный интерфейс — веб-сайт, который позволяет аутентифицированным пользователям добавлять, изменять и удалять объекты. Это так же просто, как регистрация вашей модели в административной панели:
from 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)
from 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 примера выше:
from 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 из примера выше:
from 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 был найден. Вот как это может выглядеть:
{% 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 в заданном формате (как в функции date PHP).
Вы можете объединять столько фильтров, сколько вам нужно. Вы можете написать пользовательские фильтры шаблонов. Вы можете написать пользовательские теги шаблонов, которые выполняют пользовательский код Python за кулисами.
Наконец, Django использует понятие «наследования шаблонов». Именно это делает {% extends "base.html" %}. Это означает «Сначала загрузите шаблон с именем «base», который определил набор блоков, и заполните блоки следующими блоками». Короче говоря, это позволяет значительно сократить избыточность в шаблонах: каждый шаблон должен определять только то, что уникально для этого шаблона.
Вот как может выглядеть шаблон «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, ничего не заставляет вас её использовать. В той же мере вы не обязаны использовать API базы данных Django. Вы можете использовать другой уровень абстракции базы данных, читать файлы XML, читать файлы с диска или что угодно. Каждый элемент Django — модели, представления, шаблоны — не связан с другими.
Это лишь верхушка айсберга
Это был только быстрый обзор функциональности Django. Вот некоторые более полезные функции:
- Система кэширования, которая интегрируется с memcached или другими бэкендами.
- Система синдикации, которая делает создание RSS и Atom лент таким же простым, как написание небольшого класса Python.
- Более привлекательные автоматически сгенерированные административные функции — этот обзор лишь слегка коснулся этой темы.
Следующими очевидными шагами являются загрузка Django, чтение учебника и присоединение к сообществу. Спасибо за интерес!
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/intro/overview/