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)
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()
[]
# 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()
[<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()
[<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()
[<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')
[<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)
from django.contrib import admin from . import models admin.site.register(models.Article)
Философия заключается в том, что ваш сайт редактирует персонал, клиент или, возможно, только вы — и вам не нужно создавать интерфейсы back-end, просто чтобы управлять контентом.
Типичный рабочий процесс при создании приложений Django заключается в создании моделей и быстром запуске административных сайтов, чтобы ваш персонал (или клиенты) могли начать заполнять данные. Затем разрабатывается способ представления данных широкой публике.
Проектирование URL-адресов
Чистая и элегантная схема URL-адресов — важная деталь высококачественного веб-приложения. Django поощряет красивое проектирование 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-подобную «трубу» (символ «|»). Это называется фильтром шаблона и является способом фильтрации значения переменной. В этом случае фильтр даты форматирует объект datetime Python в указанном формате (как в функции date PHP).
Вы можете объединять столько фильтров, сколько хотите. Вы можете написать пользовательские фильтры шаблонов. Вы можете написать пользовательские теги шаблонов, которые выполняют пользовательский код Python за кулисами.
Наконец, Django использует понятие «наследование шаблонов». Это то, что делает {% extends "base.html" %}. Это означает «Сначала загрузить шаблон с именем «base», который определил набор блоков, и заполнить блоки следующими блоками». Короче говоря, это позволяет значительно сократить избыточность в шаблонах: каждый шаблон должен определять только то, что уникально для этого шаблона.
Вот как может выглядеть шаблон «base.html», включая использование статических файлов:
{% load staticfiles %}
<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.8/intro/overview/