Spec-Zone.ru › Django 3.0

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

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-адресов и не добавляет лишних элементов в них, например, .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, чтение руководства и присоединение к сообществу. Спасибо за интерес!

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.0/intro/overview/

Spec-Zone.ru

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