Spec-Zone.ru › Django 1.9

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()
[]

# 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, on_delete=models.CASCADE)
from django.contrib import admin

from . import models

admin.site.register(models.Article)

Философия здесь заключается в том, что вашим сайтом пользуется персонал, клиент или, возможно, только вы — и вам не нужно создавать бэкенд-интерфейсы только для управления контентом.

Типичным рабочим процессом при создании приложений 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 (символ «|»). Это называется фильтром шаблона, и это способ отфильтровать значение переменной. В данном случае фильтр даты форматирует объект Python datetime в заданном формате (как в функции 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.9/intro/overview/

Spec-Zone.ru

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