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 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 может автоматически создать профессиональный, готовый к работе в производстве административный интерфейс — веб-сайт, позволяющий аутентифицированным пользователям добавлять, изменять и удалять объекты. Достаточно просто зарегистрировать вашу модель в административной системе:
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)
Философия заключается в том, что ваш сайт редактируется сотрудниками, клиентами или, возможно, только вами, и вам не нужно создавать интерфейсы back-end просто для управления контентом.
Обычный рабочий процесс при создании приложений 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.2/intro/overview/