Spec-Zone.ru › Django 2.1

Django одним взглядом

Поскольку Django разрабатывался в динамичной среде новостной редакции, он был спроектирован для быстрого и простого выполнения распространённых задач веб-разработки. Вот краткий обзор того, как написать веб-приложение, управляемое базой данных, с помощью Django.

Целью этого документа является предоставление достаточных технических подробностей для понимания работы Django, но это не учебник и не справочник — но у нас есть и то, и другое! Когда вы будете готовы начать проект, вы можете начать с учебника или непосредственно погрузиться в более подробную документацию.

Проектирование модели

Хотя вы можете использовать Django без базы данных, он поставляется с объектно-реляционным маппером, в котором вы описываете структуру вашей базы данных в коде Python.

Синтаксис модели данных предоставляет множество богатых способов представления ваших моделей — до сих пор он успешно решал многолетние проблемы со схемой базы данных. Вот быстрый пример:

mysite/news/models.py
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
...\> py 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 может автоматически создать профессиональный, готовый к использованию в производстве административный интерфейс — веб-сайт, который позволяет авторизованным пользователям добавлять, изменять и удалять объекты. Это так же просто, как регистрация вашей модели в административной системе:

mysite/news/models.py
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)
mysite/news/admin.py
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:

mysite/news/urls.py
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 из вышеприведённого примера:

mysite/news/views.py
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 был найден. Вот как это может выглядеть:

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 в заданном формате (как в функции date PHP).

Вы можете объединить несколько фильтров. Вы можете написать настраиваемые фильтры шаблонов. Вы можете написать настраиваемые теги шаблонов, которые выполняют пользовательский 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, ничего не заставляет вас её использовать. Также вы не обязаны использовать 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.1/intro/overview/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API