Spec-Zone.ru › Django 1.11

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):              # __unicode__ on Python 2
        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):              # __unicode__ on Python 2
        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 Reporter, Article

# 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.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

Код выше сопоставляет URL-адреса, как простые регулярные выражения, с расположением функций обратного вызова Python («представления»). Регулярные выражения используют скобки для «захвата» значений из URL-адресов. Когда пользователь запрашивает страницу, Django последовательно проверяет каждый шаблон и останавливается на первом, который соответствует запрошенному URL-адресу. (Если ни один из них не соответствует, Django вызывает специальное представление 404.) Это невероятно быстро, потому что регулярные выражения компилируются во время загрузки.

После того, как одно из регулярных выражений совпадет, Django вызовет указанное представление, которое является функцией Python. Каждому представлению передается объект запроса — содержащий метаданные запроса — и значения, захваченные в регулярном выражении.

Например, если пользователь запросил URL-адрес «/articles/2005/05/39323/», Django вызовет функцию news.views.article_detail(request, '2005', '05', '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 «pipe» (символ «|»). Это называется фильтром шаблона, и это способ отфильтровать значение переменной. В этом случае фильтр даты форматирует объект Python datetime в заданном формате (как в функции PHP date).

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

Spec-Zone.ru

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